目录
1.setter 方法注入
2.构造函数注入
3.注解注入
Spring 中的IOC 就是控制bean的容器,各个bean 之间会存在相互的引用,那在各个bean之间如何引用就显得尤为重要。
Spring 中常见的注入方法主要有:setter方法注入,构造函数注入,注解注入。
1.setter 方法注入
这种注入要是依赖于配置文件中注入
配置文件如下:
<bean id="userService" class="com.spring.UserService">
<property name="userDao" ref="userDao"></property>
</bean>
<bean id="userDao" class="com.spring.dao.UserDao"></bean>
Spring会将property中name值的每个单词首字母转换成大写,然后再在前面拼接上"set"构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入。
对应的JAVA代码:
public class UserService{
private UserDao userDao;
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
}
有一点需要注意:如果通过set方法注入属性,那么spring会通过默认的空参构造方法来实例化对象,所以如果在类中写了一个带有参数的构造方法,一定要把空参数的构造方法写上,否则spring没有办法实例化对象,导致报错。
2.构造函数注入
在配置文件中,通过constructor-args 标签注入到对应的bean 中。
<bean id="userService" class="com.spring.UserService">
<constructor-arg ref="userDao"></constructor-arg>
</bean>
<bean id="userDao" class="com.spring.dao.UserDaoJdbc"></bean>
对应的JAVA类:
public class UserService{
private UserDao userDao;
public UserService(UserDao userDao) {
this.userDao = userDao;
}
}
关于构造函数的注入,也会涉及到多个构造函数如何匹配的问题,这里可以通过配置文件中的index 以及type进行匹配。示例中,本来就只有一个参数的构造函数,比较简单。
3.注解注入
主要有4种注解的类可以注册bean,每种注解可以任意使用,只是语义上有所差异:
@Component 可以用于注册所有bean
@Controller 可以用于注册控制层的bean
@Service 可以用于注册服务层的bean
@Repository 可以用于注册dao层的bean
描述依赖关系的的主要有2种:
@Resource(java 注解)默认以byName的方式去匹配与属性名相同的bean 的id,如果没有找到就以byType的方式查找,如果byType找到多个,通过@Qualifier 注解(Spring注解)指定某个具体名称的bean。
@Autowired (Spring 注解) 默认以byType的方式去匹配类型相同的bean,如果只匹配到一个,那么就直接注入该bean,此时不论要注入的bean的name 是什么。如果匹配到多个,就会调用DefaultListablebeanfactory 的determineAutowireCandidate 方法来决定具体注入哪个bean。
determineAutowireCandidate 方法的逻辑是:
- 先找 Bean 上有@Primary 注解的,有则直接返回 bean 的 name。
- 再找 Bean 上有 @Order,@PriorityOrder 注解的,有则返回 bean 的 name。
- 最后再以名称匹配(ByName)的方式去查找相匹配的 bean。
可以简单的理解为先以 ByType 的方式去匹配,如果匹配到了多个再以 ByName 的方式去匹配,找到了对应的 bean 就去注入,没找到就抛出异常。
在配置文件中,bean的配置属性autowire有以下几种类型:
先看示例:
<bean id="auto" class="example.autoBean" autowire="byType"/>
- no:不采用autowire 机制,这种情况,当我们需要使用依赖注入时,只能使用</ref>标签
- byName:通过属性的名称自动装配(注入)。spring 会在容器中查找名称与bean属性名称一致的bean,并自动注入到bean的属性中。
- byType:通过类型自动装配(注入)。spring 会在容器中查找class与bean 属性类一致的bean,并自动注入到bean的属性中。
- constructor:类似于byType,但是通过构造函数的参数类型来匹配。
- default:采用父级标签(即beans的 default-autowire属性)的配置
? (编辑:北几岛)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|