1.set注入
1.定义一个属性,给该属性添加set方法。
2.在spring的配置文件中创建bean(该属性所属的类),然后在bean中添加<property> 标签,name的值是该属性,ref的值是引用其他bean。如<property name="accountDao" ref=“accountDaoB”>
<bean id="accountDaoB" ......>
注意(这个也是set注入的原理):属性名和bean中的name的无关;spring会将name值的每个单词首字母转换成大写,然后再在前面拼接上”set”构成一个方法名,然后去对应的类中查找该方法,通过反射调用,实现注入;
在action中注入service是特别的,在配置action标签时是没有service这个属性的,并且action类中的属性名必须和service对应的bean的id值相同,不然无法注入。
你可以这样记:name生成方法--->setXXX----> 属性 (详细一点的解析:spring根据name的值生成set方法,然后到对应的类中查找该方法,如果找到了,则通过该方法给属性赋值)
推荐文章:https://blog.youkuaiyun.com/a909301740/article/details/78379720
2.构造方法注入
1.在spring配置文件中<bean>标签中添加<constructor-arg>标签,使用ref属性引用其他的Dao 类的bean
2.在需要注入的类中添加一个带参数的构造方法。
例如:<!-- 注册userService -->
<bean id="userService" class="com.lyu.spring.service.impl.UserService">
<constructor-arg ref="userDaoJdbc"></constructor-arg>
</bean>
<!-- 注册jdbc实现的dao -->
<bean id="userDaoJdbc" class="com.lyu.spring.dao.impl.UserDaoJdbc"></bean>
------------------------------------------------------------------------------------------
private IUserDao userDao;
public UserService(IUserDao userDao) {
this.userDao = userDao;
}
注意:构造方法如何写,取决于spring配置文件中<constructor-arg>的个数,如果有一个引用,则参数只能有一个,有几个引用,构造方法中的参数就有几个,详细的请看一下的推荐文章。
推荐文章:https://blog.youkuaiyun.com/a909301740/article/details/78379720
3.基于注解注入
1.在配置文件中配置bean,并且开启组件扫描,例如:
<context:component-scan base-package="com.aaa" />
2.使用@Autowired或@Resource注入
注意:
关于@Repository、@Service 和 @Controller 和 @Component四个注解的使用情形
在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释.这里就是说把这个类交给Spring管理,重新起个名字叫userManager,由于不好说这个类属于哪个层面,就用@Component.
推荐文章:https://blog.youkuaiyun.com/u013412772/article/details/73741710
4.静态工厂注入(不常用)
1.创建一个工厂类,类中有一个静态的方法获取dao
2.在spring配置文件中配置dao的bean,并且在该bean配置factory-method属性,其他的Service层的bean引用该dao的bean
3.使用set方法注入
推荐文章:https://blog.youkuaiyun.com/shadow_zed/article/details/72566611
5.实例工厂注入(不常用)
和静态工厂差不多,只是获取dao的方法不是静态的和多配置了一个工厂类的bean(因为不是静态的了)。其他的都一样。