Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)
来源:互联网 发布:幼儿学前教育软件 编辑:程序博客网 时间:2024/04/27 22:51
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
}
要能在ReportDao中使用jdbcTemplate对象,需要在applicationContext.xml中(这里没有把PropertyPlaceholderConfiger加载属性配置文件的配置信息写上去,可以参考http://my.oschina.net/u/1167544/blog/160713):
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
>
<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>,但是增加其它相应的配置:
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)
- Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)
- 控制反转(IOC)Inversion of Control或依赖注入(DI)Dependency Injection
- IoC(Inversion of Control)控制反转和 DI(Dependency Injection)依赖注入
- 控制反转(Inversion of Control)与依赖注入(Dependency Injection)
- 控制反转(Inversion of Control)与依赖注入(Dependency Injection)
- 深度理解依赖注入(Dependence Injection)(IOC,Inversion of control,控制反转)
- Spring核心原理:依赖注入Dependency Injection(控制反转Inversion of Control)
- 工厂模式与控制反转(Inversion of Control)及依赖注入(Dependency Injection)
- Inversion of Control(控制反转)之 Dependency Injection(依赖注入)
- Spring 控制反转IOC,依赖注入DI
- Spring 控制反转(IoC)容器与依赖注入(DI)
- Spring控制反转与依赖注入(IOC && DI)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring 控制反转(IOC)与依赖注入(DI)
- Spring入门--控制反转(IOC)与依赖注入(DI)
- Spring之IOC(控制反转)\DI依赖注入
- Helloworld之Spring依赖注入/控制反转(DI/IoC)版
- Linux中使用crontab
- CAGradientLayer简介
- C 语言qsort排序算法的使用总结
- 第16周oj--逆序输出数组
- SQL错误:ORA-12899
- Spring环境搭建之:控制反转(IoC Inversion of Control)与依赖注入(DI Depenency Injection)
- 基于 HTML5 的人脸识别技术
- 给linnerLayout加边框(可以只加底部)
- 转:POI操作Excel:cell的背景颜色类型
- Linux中创建NFS
- 第十六周项目3-有相同数字?
- C库源代码阅读(快速定位源码)
- 运用递归解决斐波那契数列
- Spring环境搭建之:Spring MVC、文件上传下载