注入方式:
基于构造函数的依赖注入:
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 setUserDao(UserDao userDao){
this.userDao = userDao;
}
}
基于字段的依赖注入:
public class UserServiceImpl implents UserService{
@Autowire
private UserDao userDao;
}
基于字段的依赖注入缺点:
(1)对于有final修饰的变量不好使
Spring的IOC对待属性的注入使用的是set形式,但是final类型的变量在调用class的构造函数的这个过程当中就得初始化完成,这个是基于字段的依赖注入做不到的地方.只能使用基于构造函数的依赖注入的方式。
(2)掩盖单一职责的设计思想
采用的是基于构造函数的依赖注入的方式来使用Spring的IOC的时候,当你注入的太多的时候,这个构造方法的参数就会很庞大;但是使用基于字段的依赖注入不会让你察觉,你会很沉浸在@Autowire当中。
(3)与Spring的IOC机制紧密耦合
当你使用基于字段的依赖注入方式的时候,确实可以省略构造方法和setter这些个模板类型的方法,但是,你把控制权全给Spring的IOC了,别的类想重新设置下你的某个注入属性,没法处理。
(4)隐藏依赖性
当你使用Spring的IOC的时候,被注入的类应当使用一些public类型(构造方法,和setter类型方法)的方法来向外界表达:我需要什么依赖.但是基于字段的依赖注入的方式,基本都是private形式的,private把属性都给封印到class当中了。
(5) 无法对注入的属性进行安检
基于字段的依赖注入方式,你在程序启动的时候无法拿到这个类,只有在真正的业务使用的时候才会拿到;想在属性注入的时候,想根据这个注入的对象操作点东西,你无法办到。