注入方式
构造函数注入
public class UserServiceImpl implents UserService{
private UserDao userDao;
@Autowire
public UserServiceImpl(UserDao userDao){
this.userDao = userDao;
}
}
setter注入
public class UserServiceImpl implents UserService{
private UserDao userDao;
@Autowire
public serUserDao(UserDao userDao){
this.userDao = userDao;
}
}
基于字段注入
public class UserServiceImpl implents UserService{
@Autowire
private UserDao userDao;
}
基于字段的依赖注入缺点
对于有final修饰的变量不好使
Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式
掩盖单一职责的设计思想
与Spring的IOC机制紧密耦合
当你使用基于字段的依赖注入方式的时候,确实可以省略构造方法和setter这些个模板类型的方法,但是,你把控制权全给Spring的IOC了,别的类想重新设置下你的某个注入属性,没法处理(当然反射可以做到).
本身Spring的目的就是解耦和依赖反转,结果通过再次与类注入器(在本例中为Spring)耦合,失去了通过自动装配类字段而实现的对类的解耦,从而使类在Spring容器之外无效.
隐藏依赖性
当你使用Spring的IOC的时候,被注入的类应当使用一些public类型(构造方法,和setter类型方法)的方法来向外界表达:我需要什么依赖.但是基于字段的依赖注入的方式,基本都是private形式的,private把属性都给封印到class当中了.
无法对注入的属性进行校验
注入方法
@Autowired
Spring Bean注入一般采用@Autowired
注解,安装类型进行注入。
public @interface Autowired {
boolean required() default true;
}
默认如果没有找到Bean,则会抛出异常,可以设置 required
属性为false
。
如果有多个同一类型的Bean,在@Autowired时会抛出异常。
@Primary
如果有多个同类型Bean,指定主要的bean。不然注入时会抛出异常
@Bean
public Date d1() {
return new Date() ;
}
@Bean
@Primary
public Date d2() {
return new Date() ;
}
@Autowired
private Date date;
@Resoure
JavaEE注解,按照名称进行查找。
@Resource("d1")
private Date date
@Qualifier
按照名称查找bean。
@Autowired
@Qualifier("d1")
private Date date ;
筛选注入的Bean
在应用加了@Qualifier
注解的@Autowired
注入时,只有在生成bean时,在@Bean
注解声明的对象上,加上@Qualifier
注解的bean才能被注入。
例如:
@Qualifier
@Bean
public Date d1() {
return new Date() ;
}
@Bean
public Date d2() {
return new Date() ;
}
@Autowired
private List<Date> dates = Collections.emptyList() ;
@Autowired
@Qualifier
private List<Date> dates = Collections.emptyList() ;
Spring cloud @LoadBalanced
在使用Ribbon做负载均衡时,在配置RestTemplate
时会加入如下注解:
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate() ;
}
@Target({ ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD })
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Qualifier
public @interface LoadBalanced {
}
在Ribbon的自动配置类LoadBalancerAutoConfiguration
中,指明了只收集带有@LoadBalanced
注解的RestTemplate对象。然后给对应RestTemplate设置拦截器来实现直接通过服务名就能调用接口。
@Configuration(
proxyBeanMethods = false
)
@ConditionalOnClass({RestTemplate.class})
@ConditionalOnBean({LoadBalancerClient.class})
@EnableConfigurationProperties({LoadBalancerRetryProperties.class})
public class LoadBalancerAutoConfiguration {
@LoadBalanced
@Autowired(
required = false
)
private List<RestTemplate> restTemplates = Collections.emptyList();
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)