Spring框架中的IOC和DI

Spring是什么?
Spring :轻量级框架,Java EE的春天,当前主流框架
目标:使现有技术更加易用,推进编码最佳实践
内容:
依赖注入容器
Web集成
数据访问支持
简化Hibernate编码
声明式事务
AOP实现
企业级框架
大规模:用户、数据、功能数
性能和安全要求高
业务复杂
灵活应变
Spring框架内容:

IOC和DI
IOC(Inversion of Control):其思想是反转资源获取的方向.传统的资源查找方式要求组件向容器发起请求查找资源,作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送给它所管理的组件,组件所要做的仅是选择一种合适的方式来接受资源。这种行为也被称为查找的被动形式。
DI(Dependency Injection)——IOC的另一种表达方式:即组件以一些预先定义好的方式(例如:setter方法)接受l来自如容器的资源注入,相当于IOC而言,这种表述更直接。

为什么使用依赖注入(DI)?


IOC的前世今生
IOC前生——分离接口与实现
需求:生成HTML或PDF格式的不同类型的报表

IOC前生——采用工厂设计模式

IOC今世——采用反转控制

Spring容器的配置:
     在XML文件中通过bean节点来配置bean
  在Spring IOC容器读取Bean配置创建Bean实例之前,必须对它进行实例化。只有在容器实例化后,才可以从IOC容器里获取Bean实例并使用。
     Spring提供了两种类型的IOC容器实现
   BeanFactory:IOC容器的底层基本实现
   ApplicationContext:提供了更多的高级特性,是BeanFactory的子接口。
习题训练:
要点:Spring依赖注入
需求说明:输出:
张嘎说:“三天不打小鬼子,手都痒痒!”
Rod说:“世界上有2种人,认识二进制的和不认识二进制的。”

public class HelloSpring2 {
	private String name;
	private String say;
	//无参构造,属性注入
	public String getName() {
		return name;
	}
	//通过有参构造,构造方法注入
	public void setName(String name) {
		this.name = name;
	}
	public String getSay() {
		return say;
	}
	public void setSay(String say) {
		this.say = say;
	}
	public void showInfo(){
		System.out.println(name+"说:"+say);
	}
}
ApplicationContext.xml
<bean id="hello1" class="com.jredu.spring1.HelloSpring2">
		<property name="name" value="张嘎"></property>
		<property name="say" value="三天不打小鬼子,手都痒痒!"></property>
	</bean>
	<bean id="hello2" class="com.jredu.spring1.HelloSpring2">
		<property name="name" value="Rod"></property>
		<property name="say" value="世界上有2种人,认识二进制的和不认识二进制的。"></property>
	</bean>
测试代码
public class HelloTest {
	public static void main(String[] args) {
		ApplicationContext app=new ClassPathXmlApplicationContext("applicationContext.xml");					
		HelloSpring2 hello1=(HelloSpring2) app.getBean("hello1");
		hello1.showInfo();
		
		HelloSpring2 hello2=(HelloSpring2) app.getBean("hello2");
		hello2.showInfo();}}
配置Bean基于XML
在XML文件中通过bean节点来配置bean
<bean id="hello" class="com.jredu.spring1.HelloSpring">
		<property name="age" value="22"></property>
		<property name="name" value="张三"></property>
	</bean>
其中id:Bean的名称
在IOC容器中必须是唯一的
若id没有指定,Spring自动将类名作为Bean的名字
XML配置Bean——依赖注入的方式
依赖注入的方式配置Bean,Spring支持3种依赖注入的方式
1.属性注入
2.构造器注入
3.工厂方法注入(很少使用,不推荐)
1.属性注入(通过无参构造)
     属性注入即通过setter方法注入Bean的属性值或依赖的对象
     属性注入使用<property>元素,使用name属性指定Bean的属性名称,value属性或<value.子节点指定属性值
     属性注入是实际应用中最常用 的注入方式
(上面基于XML配置Bean的例子就是属性注入)
2.构造器注入(至少有一个有参函数,传参数)
通过构造方法注入Bean的属性值或依赖的对象,它保证了Bean实例在实例化后就可以使用
构造器注入在<constructor-arg>元素里声明属性,常用属性:
name、value、type
<bean id="hello2" class="com.jredu.spring1.HelloSpring2">
		<constructor-arg value="张三" index="0" ></constructor-arg>
		<constructor-arg value="10" index="1"></constructor-arg>
	</bean> 
	<bean id="hello3" class="com.jredu.spring1.HelloSpring2">
		<constructor-arg value="20" type="int" ></constructor-arg>
		<constructor-arg value="李四" type="java.lang.String"></constructor-arg>
	</bean>
3.字面值:可用字符串表示的值
若字面值中包含特殊字符,可以使用<![CDATA[]]>吧字面包裹起来。
在XML袁术中,“<”和“&”是非法的
CDATA部分中的所有内容都会被解析器忽略
CDATA部分由“<![CDATA["开始,由"]]>”结束
CDATA部分不能包含字符串“]]>”,也不允许嵌套
标记CDATA部分结尾的“]]>”不能包含空格或折行

ApplicationContext的主要实现类:
ClassPathXmlApplicationContext:从类路径下加载配置文件
FileSystemXmlApplicationContext:从文件系统中加载配置文件
ConfigurableApplicationContext扩展于ApplicationContext,新增加两个主要方法:refresh(0和close(),rang ApplicationContext具有启动、刷新和关闭上下文的能力
ApplicationContext在初始化上下文时就实例化所有单例的Bean
WebApplicationContext是专门为WEB应用而准备的,它允许从x相对于WEB根目录的路径中完成初始化工作
从IOC容器中获取Bean,调用ApplicationContext的getBean()方法
 
  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值