Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)
2014-12-10 17:01
806 查看
控制反转,要明白是控制什么,怎么反转了就OK了
1.控制什么
不用Spring框架时,每个类文件中所用到的对象都要我们在代码中通过new来创建,这样一来,在面向接口编程时,也要通过new来明确的创建一个接口实现类,虽是面向接口了,可是接口实现类已经确定了,不能灵活更换其它实现类,这就产生了高耦合。
有了Spring框架,我们就不再需要在类文件中用new去创建对象了,也就根本不需要我们去创建了,Spring通过配置文件来完成对象的创建。
到这应该明白,控制的是对象的创建
2.什么反转了
对象的控制权反转了,原来是程序员通过new来完成对象的创建,而现在由Spring框架来完成。即对象的控制权转变了。
applicationContext.xml的配置
<bean id="" class="">部分就相当于ReportDao reportDao = new ReportDao();这样Spring就可以帮我们创建一个名为reportDao的对象,class要写上带完整包路径的类名称。其中的id可以用name来替换,即
<bean name="" class="">,区别是name的值可以带有特殊字符。
<bean id="" class="" scope="singleton|prototype|request|session">
scope可以取4个值:singleton表示单例,生成的对象只有一个;prototype表示原型,每次生成的都是新的对象
不写的时候默认是singleton
Spring创建好的对象,我们可以通过Spring的Bean工厂获取:
当然我们一般不需要在类文件中去写这些代码,一般做单元测试时可以使用以上方法。那Spring创建好的对象我们怎么拿来用呢?这就要说到依赖注入(DI)的功能了
依赖注入
一般一个类文件中需要用到其它类来,这就构成了依赖关系。如:ReportDao类中需要用到JdbcTemplate类完成数据库的操作。这样ReportDao就依赖JdbcTemplate,反过来JdbcTemplate就是RpeortDao的依赖。
要能在ReportDao中使用jdbcTemplate对象,需要在applicationContext.xml中(这里没有把PropertyPlaceholderConfiger加载属性配置文件的配置信息写上去,可以参考http://my.oschina.net/u/1167544/blog/160713):
<property name="" ref="" />
name是对应的类的属性,必须与类的属性的名称一样,Spring会调用对应的setter方法
ref是调用setter方法时,传入的参数,即要注入的对象,必须与<bean id="" />中的某一个id一致
如这里,生成reportDao对象时,会调用setJdbcTemplate()方法,而这个方法要传入一个JdbcTemplate对象,ref指向了jdbcTemplate,与<bean id="jdbcTemplate" />一致,就会将这个jdbcTemplate对象作为参数传入,并完成setJdbcTemplate()方法的执行,这样ReportDao中的JdbcTemplate对象成功注入了。
Spring还提供了其它的注入方法,最常用的就是上面的setter注入,其它的可以参考spring文档。
依赖的自动注入,常用的有以下2种:
byName是根据set的名称来注入,如果名称不对就无法注入(默认情况)
byType表示是根据类型来注入,和名称无关,如果一个类中有两个相同类型的对象就无法注入
1.通过配置文件实现自动注入
<bean id="" class="" autowire="byName|byType|default|construtor|no" />
给bean添加上autowire属性就表示该bean的属性可以自动注入
如果入在<beans>上,则所有的bean属性都可以自动注入
2.通过注解实现自动注入
这种情况下配置文件中就可以省掉<bean>,但是增加其它相应的配置:
类文件
对于类上的注解@Component不同的类对应不同的注解,只是为了区别开类的功能,当然统一使用@Component也行
由于开发中一般都分为四层体系:data、dao、service、action
data------->@Component
dao-------->@Repository
service---->@Service
action----->@Controller
1.控制什么
不用Spring框架时,每个类文件中所用到的对象都要我们在代码中通过new来创建,这样一来,在面向接口编程时,也要通过new来明确的创建一个接口实现类,虽是面向接口了,可是接口实现类已经确定了,不能灵活更换其它实现类,这就产生了高耦合。
有了Spring框架,我们就不再需要在类文件中用new去创建对象了,也就根本不需要我们去创建了,Spring通过配置文件来完成对象的创建。
到这应该明白,控制的是对象的创建
2.什么反转了
对象的控制权反转了,原来是程序员通过new来完成对象的创建,而现在由Spring框架来完成。即对象的控制权转变了。
applicationContext.xml的配置
1 | <? xml version = "1.0" encoding = "UTF-8" ?> |
2 | < beans xmlns = "http://www.springframework.org/schema/beans" |
3 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" |
4 | xsi:schemaLocation=" |
5 | http://www.springframework.org/schema/beans |
6 | http://www.springframework.org/schema/beans/spring-beans.xsd"> |
7 | < bean id = "reportDao" class = "com.bocloud.report.dao.ReportDao" /> |
8 | </ beans > |
<bean id="" class="">部分就相当于ReportDao reportDao = new ReportDao();这样Spring就可以帮我们创建一个名为reportDao的对象,class要写上带完整包路径的类名称。其中的id可以用name来替换,即
<bean name="" class="">,区别是name的值可以带有特殊字符。
<bean id="" class="" scope="singleton|prototype|request|session">
scope可以取4个值:singleton表示单例,生成的对象只有一个;prototype表示原型,每次生成的都是新的对象
不写的时候默认是singleton
Spring创建好的对象,我们可以通过Spring的Bean工厂获取:
1 | BeanFactory factory = new ClassPathXmlApplicationContext( "applicationContext.xml" ); |
2 | ReportDao reportDao = factory.getBean( "reportDao" ); |
依赖注入
一般一个类文件中需要用到其它类来,这就构成了依赖关系。如:ReportDao类中需要用到JdbcTemplate类完成数据库的操作。这样ReportDao就依赖JdbcTemplate,反过来JdbcTemplate就是RpeortDao的依赖。
1 | public class ReportDao { |
2 | private JdbcTemplate jdbcTemplate; |
3 |
4 | private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { |
5 | this .jdbcTemplate = jdbcTemplate; |
6 | } |
7 |
8 | // 其它代码 |
9 | } |
01 | <!-- 数据源配置, 使用DBCP数据库连接池 --> |
02 | < bean id = "dataSource" class = "org.apache.commons.dbcp.BasicDataSource" destroy-method = "close" > |
03 | <!-- 连接信息 --> |
04 | < property name = "driverClassName" value = "${jdbc.driverClassName}" /> |
05 | < property name = "url" value = "${jdbc.url}" /> |
06 | < property name = "username" value = "${jdbc.username}" /> |
07 | < property name = "password" value = "${jdbc.password}" /> |
08 | </ bean > |
09 |
10 | < bean id = "jdbcTemplate" class = "org.springframework.jdbc.core.JdbcTemplate" > |
11 | < property name = "dataSource" ref = "dataSource" /> |
12 | </ bean > |
13 |
14 | < bean id = "reportDao" class = "com.bocloud.report.dao.ReportDao" > |
15 | < property name = "jdbcTemplate" ref = "jdbcTemplate" /> |
16 | </ bean > |
name是对应的类的属性,必须与类的属性的名称一样,Spring会调用对应的setter方法
ref是调用setter方法时,传入的参数,即要注入的对象,必须与<bean id="" />中的某一个id一致
如这里,生成reportDao对象时,会调用setJdbcTemplate()方法,而这个方法要传入一个JdbcTemplate对象,ref指向了jdbcTemplate,与<bean id="jdbcTemplate" />一致,就会将这个jdbcTemplate对象作为参数传入,并完成setJdbcTemplate()方法的执行,这样ReportDao中的JdbcTemplate对象成功注入了。
Spring还提供了其它的注入方法,最常用的就是上面的setter注入,其它的可以参考spring文档。
依赖的自动注入,常用的有以下2种:
byName是根据set的名称来注入,如果名称不对就无法注入(默认情况)
byType表示是根据类型来注入,和名称无关,如果一个类中有两个相同类型的对象就无法注入
1.通过配置文件实现自动注入
<bean id="" class="" autowire="byName|byType|default|construtor|no" />
给bean添加上autowire属性就表示该bean的属性可以自动注入
如果入在<beans>上,则所有的bean属性都可以自动注入
2.通过注解实现自动注入
这种情况下配置文件中就可以省掉<bean>,但是增加其它相应的配置:
01 | <? xml version = "1.0" encoding = "UTF-8" ?> |
02 | < beans xmlns = "http://www.springframework.org/schema/beans" |
03 | xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" |
04 | xmlns:context = "http://www.springframework.org/schema/context" |
05 | xsi:schemaLocation="http://www.springframework.org/schema/beans |
06 | http://www.springframework.org/schema/beans/spring-beans.xsd |
07 | http://www.springframework.org/schema/context |
08 | http://www.springframework.org/schema/context/spring-context.xsd"> |
09 | <!-- 打开annotation的支持 --> |
10 | < context:annotation-config /> |
11 | <!-- 在哪个包下扫描annotation --> |
12 | < context:component-scan base-package = "com.bocloud.report" > |
13 | </ beans > |
01 | @Component ( "reportDao" ) // 此注解就能按指定的名称自动生成该类的对象,@Component时默认为类名 |
02 | public class ReportDao { |
03 | // @Resource 自动注入,是按名称,可以放在字段上,也可以放在setter方法上 |
04 | @Autowired // 此注解就能自动注入,是按类型,可以放在字段上,也可以放在setter方法上 |
05 | private JdbcTemplate jdbcTemplate; |
06 |
07 | private void setJdbcTemplate(JdbcTemplate jdbcTemplate) { |
08 | this .jdbcTemplate = jdbcTemplate; |
09 | } |
10 |
11 | // 其它代码 |
12 | } |
由于开发中一般都分为四层体系:data、dao、service、action
data------->@Component
dao-------->@Repository
service---->@Service
action----->@Controller
相关文章推荐
- Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)
- IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入
- Spring核心原理:依赖注入Dependency Injection(控制反转Inversion of Control)
- spring01 环境搭建、控制反转、依赖注入、springIOC和DI实现MVC模式
- 依赖注入 控制反转 服务定位器 模式 Dependency Injection Inversion of Control Service Locator Patterns | 超级经典
- 控制反转Inversion of Control (IoC) 与 依赖注入Dependency Injection (DI)
- Spring反转控制(IOC)和依赖注入(DI)
- IOC-控制反转(Inversion of Control),也成依赖倒置(Dependency Inversion Principle)
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
- Spring的IOC(控制反转Inversion of Control)
- Sring控制反转(Inversion of Control,Ioc)也被称为依赖注入(Dependency Injection,DI)原理用反射和代理实现
- 依赖注入(Dependency Injection) 实现 控制反转(Inversion of Control)
- 从简单实例了解Spring的控制反转IoC(Inversion of Control)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring的控制反转(IoC)和依赖注入(DI)
- 利用反射简单模拟Spring的控制反转(Ioc)和依赖注入(DI)
- IoC(Inversion of Control,反转控制)或DI(Dependency Injection,依赖注入)
- Spring原理机制资源汇总(控制反转(IoC)与依赖注入(DI)主题)
- 【spring进阶】--控制反转(IoC)和依赖注入(DI)
- 关于控制反转IoC--Inversion of Control Containers and the Dependency Injection pattern