依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)。因此,容器的工作就是创建bean时注入那些依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转(Inversion of Control, IoC) 名字的由来。
setter注入是spring根据配置文件自动完成的,你不需要在程序中显示的调用,因此代码没有与spring框架直接耦合。
而通过getBean方法则首先意味着你必须获取到BeanFactory或ApplicationContext,这种方式叫依赖查找,代码了解框架的存在,耦合度较高。
应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(甚至不知道依赖在哪里定义和依赖的实际类)之后,实现更高层次的松耦合将易如反掌。DI有三种注入方式,即Setter注入(*.这个是最重要和最主要的,企业用的最多且最灵活的)、构造器注入和接口注入。
项目源码是接http://moshowgame.iteye.com/admin/blogs/1605087的。但是只有一个地方改了(就是UserService里面加了个默认构造函数),但是总体结构没变。这里只讲解XML,前面的model、DAO、DAO.impl和service就不再重复说了。
*。在bean.xml配置setter注入和constructor注入
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
<bean id="userDAOImpl" class="com.bjsxt.dao.impl.UserDAOImpl">
</bean>
<bean id="userService" class="com.bjsxt.service.UserService">
<!-- setter设置注入就是调用setXXX方法,但是需要保留默认构造方法-->
<!--
<property name="userDAO" ref="userDAOImpl" />
-->
<!-- constructor构造注入调用的是构造方法-->
<!--
<constructor-arg index="0">
<ref bean="userDAOImpl"/>
</constructor-arg>
-->
</bean>
</beans>
*。上面两种方法写在一起了,要用的方法请取消掉<!-- -->的注释,然后将另外的方法用<!-- -->注释掉。
*。注入的思路。等于就是说从UserDAOImpl中new一个UserDAO的实例userDAO,然后注入到UserService里面的setter或constructor里面。用spring的方式讲就是参考bean获得实例然后注入到目标bean里面去,即是要用到两个bean。
*。常见错误1。用setter设置注入需要保留默认构造方法,不然会报错,我就是这样错了一个下午,问大神才知道的。
public UserService() {}
用constructor构造注入需要重写构造方法并且带参数 public UserService(UserDAO userDAO) {
super();
this.userDAO = userDAO;
}
*。常见错误2。<property name="userDAO"..这里的userDAO名字要和public UserService(UserDAO userDAO)的userDAO一致,才能确认不会注入错,下午也因为这个错了。
*。很多东西刚开始觉得很难,学过了之后、练过了之后、错过了之后才明白,其实很简单。
⊙_⊙最后,按照我的惯例,附上本次的项目源码,类库用到三个(spring.jar junit.jar(eclipse自带) commons-logging.jar)。
^_^还有什么好方法或者疑问和意见欢迎大家提出来一起讨论!
分享到:
相关推荐
IOC DI 一个spring4.2.0 spring setter 和构造 注入 的小例子
Spring之Construcotrer注入和setter注入不同的XML写法方式 ,具体效果和过程看博文http://blog.csdn.net/evankaka/article/details/44878225
spring的setter注入实现mysql数据库的连接 下载 看看吧
Spring依赖注入使用setter设注入demo。完整可运行。
重温spring setter注入
NULL 博文链接:https://lixiongqing.iteye.com/blog/2124696
Java开发学习(六)----DI依赖注入之setter及构造器注入解析.doc
JavaSpring2 提交1:通过Setter注入配置Spring Bean 提交2:包含通过构造函数注入配置Spring Bean(添加餐类,MyApp包,FileContext路径)
spring-1 演示了使用setter方式及构造器方式创建bean,util:list标签创建集合,p标签简化配置 和依赖注入, 以及bean的autowire和继承与依赖,以及bean的作用域。 spring-2 演示了外部配置文件的引入(connection)...
如果需要给该bean提供一些初始化参数,则需要通过依赖注入方式,所谓的 依赖注入就是通过spring将bean所需要的一些参数传递到bean实例对象的过程(将依赖关系注入到对象中) ,spring的依赖注入有3种方式: ...
NULL 博文链接:https://diaochenlong2.iteye.com/blog/1831186
下面小编就为大家带来一篇Spring根据XML配置文件注入属性的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
两种依赖注入的类型分别是setter注入和构造方法注入。详细见代码..
1 首先我们需要一个bean,用某种方法(设置注入需要有setter函数,构造注入需要有构造函数,相应的bean.xml配置文件也会不同)设定注入方式。 2 bean.xml,设置bean与类的关系,并关联默认的注入值。 3 获取...
Spring容器的特点 (1)容器对对象的管理 a.创建时机:默认和容器一起创建。 可以使用延缓实例化 可以使用延缓所有组件实例化 b.... c.创建对象的模式(使用范围):scope控制,可以...构造注入 c.接口注入(以后了解)
//使用Lombok帮助我们生成这些内容 getter setter 全参构造无参构造equals hashcode //Lombok 使用步骤 // 1 检查idea是否已经安装 Lombok // 2 检查是否勾选了 enable annotation processer // 3 导入 Lombok依赖 /...
(一) setter注入类型Setter Injection 9 (二) 构造方法Constructor Injection 10 四、 id、name 11 五、 简单属性的注入 11 六、 Bean的作用范围scope 12 七、 集合注入 12 八、 自动装配autowire 13 (一) byName 13...
20. 哪种依赖注入方式你建议使用,构造器注入,还是 Setter 方法注入? 21.什么是 Spring beans? 22. 一个 Spring Bean 定义 包含什么? 23. 如何给 Spring 容器提供配置元数据? 24. 你怎样定义类的作用域? 25. ...
- 属性(setter)注入 容器 容器是管理 组件的生命周期,注入组件(声明)所需的资源 例如: 容器 : 国家 义务教育、纳税、社保、医疗、养老 组件 : 公民 - apache tomcat 是 JSP/Servlet 容器,管理