- 浏览: 442800 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
鱼里的yeol:
正在学习EJB 感觉有些吃力
Ejb3学习之二----Ejb3的Ejb Bean类型介绍 -
phoenix5870:
默认就是singleton的。
Spring中的Singleton模式和Java中的Singleton模式 -
jhys7s8jd:
pdf打印机下载 无水印http://www.onlinedo ...
PDFCreate工具的使用 -
wang371134086:
:e vil:
浅谈Struts2中的拦截器实现责任链模式 -
liu765023051:
亲,local与remote有什么区别呢
EJB学习之三---Local和Remote接口
Key points
依赖注入的原理
依赖注入的方式---XML配置
依赖注入的方式---注解的方式
Java包装类的注入
Collection的注入
学习Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。
一 DI的原理
DI的基本原理:对象之间的依赖关系只会通过三种方式:构造函数参数,工厂方法的参数以及构造函数或工厂方法创建的对象属性设置。因此,容器的工作哦就是在创建Bean时注入所有的依赖关系。相对于由Bean自己控制其实例化,直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)这三种自主控制依赖关系注入的方法,而控制权从根本上发生改变,即控制反转(Inverse of Controll)---IOC.
应用DI规则后,我们不用在关注对象之间的依赖关系,从而达到高层次的松耦合。DI有两种实现方式---Setter/getter方式(传值方式)和构造器方式(引用方式)。
下面就从XML配置和注解角度来介绍这两种方式。
二 DI的方式---XML配置
1. Setter/getter方法
下面是一个Sample:
1) beans.xml:
2) PersonService.java
3) PersonServiceBean.java
4) PersonDao.java
5) PersonDaoImpl.java
6) SpringTest.java(测试类)
Console出现的Log:
在这里,是采用一种外部注入的方式,我们还可以采用内部注入的方式来处理:
Beans.xml修改如下:
2. 构造器注入
以下是一个Sample:
1) Beans.xml:
2) PersonService.java:同Setter方法注入
3) PersonServiceBean.java
}
4) PersonDao.java:同Setter方法注入
5) PersonDaoImpl.java:同Setter方法注入
6) 测试类(SpringTest.java):同上
Console出现的Log:
三 DI的方式---注解的配置
自从Jdk5中引入Annotation类后,在EJB和Spring中得到广泛的使用,也越来越被开发者们在平时的应用中使用。主要是用在Field上的注入。在日常的应用开发中,一个项目中有很多的bean,如果使用XML文件配置,就会导致配置文件难以管理。使用注解注入的时候,能够使bean的配置文件内容不至于繁杂。
首先介绍下注解的两种方式:@Resource(javax.annotation.Resource)和@Autowired.
@Resource:首先按照名称去寻找当前的bean,如果找不到的话,那就以类型装配。
@Autowired:首先按照类型去寻找当前的bean, 如果找不到的话,那就以名称装配。
1. Resource
下面介绍一个Sample:
1) Beans.xml:
2) PersonService.java:同上。
3) PersonServiceBean.java
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上
2. Autowired
下面介绍一个Sample:
1) Beans.xml:
2) PersonService.java:同上。
3) PersonServiceBean.java
}
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上
Noted:所有的注解可以使用在Field上,也可以使用到Setter方法上,最后结果都是一样的。
四 Java基本类型的注入
Java基本类型的注解可以参考二.2
在beans.xml中配置如下:
五 Collection的注入
Collection的注入分为以下两步:
1. Beans.xml:
2. SpringTest.java:
依赖注入的原理
依赖注入的方式---XML配置
依赖注入的方式---注解的方式
Java包装类的注入
Collection的注入
学习Spring 它的核心就是IOC和AOP。而IOC中实现Bean注入的实现方式之一就是DI(依赖注入)。
一 DI的原理
DI的基本原理:对象之间的依赖关系只会通过三种方式:构造函数参数,工厂方法的参数以及构造函数或工厂方法创建的对象属性设置。因此,容器的工作哦就是在创建Bean时注入所有的依赖关系。相对于由Bean自己控制其实例化,直接在构造器中指定依赖关系或者类似服务定位器(Service Locator)这三种自主控制依赖关系注入的方法,而控制权从根本上发生改变,即控制反转(Inverse of Controll)---IOC.
应用DI规则后,我们不用在关注对象之间的依赖关系,从而达到高层次的松耦合。DI有两种实现方式---Setter/getter方式(传值方式)和构造器方式(引用方式)。
下面就从XML配置和注解角度来介绍这两种方式。
二 DI的方式---XML配置
1. Setter/getter方法
下面是一个Sample:
1) beans.xml:
<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean> <bean id="personService" class="com.spring.service.impl.PersonServiceBean" scope="singleton" > <property name=”personDao” ref=”personDao”/> </bean>
2) PersonService.java
public interface PersonService { public void save(); }
3) PersonServiceBean.java
public class PersonServiceBean implements PersonService{ //all 需要注入的bean都在这里处理 private PersonDao personDao; public PersonServiceBean(){ System.out.println("personServiceBean.constructor() is running."); } /** * 使用getter/setter方法注入 * @return the personDao */ public PersonDao getPersonDao() { return personDao; } /** * @param personDao the personDao to set */ //使用注解注入到setter方法上,等同于注解注入到Field上。 //@Resource public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public void save(){ System.out.println("Name:" +name); personDao.add(); } @PostConstruct public void init(){ System.out.println("PersonServiceBean.init() is running."); } @PreDestroy public void destory(){ System.out.println("PersonServiceBean.destory() is running."); } }
4) PersonDao.java
public interface PersonDao { public void add(); }
5) PersonDaoImpl.java
public class PersonDaoImpl implements PersonDao { public void add(){ System.out.println("PersonDao.add() is running."); } }
6) SpringTest.java(测试类)
public class SpringTest { /** * @throws java.lang.Exception */ @BeforeClass public static void setUpBeforeClass() throws Exception { } @Test public void instanceSpring(){ AbstractApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); PersonService personService = (PersonService)context.getBean("personService"); personService.save(); /** * call destroy() */ context.close(); } }
Console出现的Log:
personServiceBean.constructor() is running. PersonServiceBean.init() is running. Name:null PersonDao.add() is running.
在这里,是采用一种外部注入的方式,我们还可以采用内部注入的方式来处理:
Beans.xml修改如下:
<bean id="personService" class="com.spring.service.impl.PersonServiceBean" scope="singleton" > <property name="personDao"> <bean class="com.spring.dao.impl.PersonDaoImpl"/> </property> </bean>
2. 构造器注入
以下是一个Sample:
1) Beans.xml:
<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean> <bean id="personService" class="com.spring.service.impl.PersonServiceBean" scope="singleton" > <!—使用构造函数注入--> <constructor-arg index="0" type="com.spring.dao.PersonDao" ref="personDao"/> <constructor-arg index="1" value="Jamson" /> </bean>
2) PersonService.java:同Setter方法注入
3) PersonServiceBean.java
public class PersonServiceBean implements PersonService{ //all 需要注入的bean都在这里处理 //使用注解方式注入,首先按名称查找,然后是按照类型查找 //@Resource(name="personDao") // @Autowired private PersonDao personDao; public String name; public PersonServiceBean(){ System.out.println("personServiceBean.constructor() is running."); } /** * 使用构造器注入 * @param personDao * @param name */ public PersonServiceBean(PersonDao personDao, String name) { this.personDao = personDao; this.name = name; } // /** // * 使用getter/setter方法注入 // * @return the personDao // */ // public PersonDao getPersonDao() { // return personDao; // } // // /** // * @param personDao the personDao to set // */ // //使用注解注入到setter方法上,等同于注解注入到Field上。 // //@Resource // public void setPersonDao(PersonDao personDao) { // this.personDao = personDao; // } public void save(){ System.out.println("Name:" +name); personDao.add(); } @PostConstruct public void init(){ System.out.println("PersonServiceBean.init() is running."); } @PreDestroy public void destory(){ System.out.println("PersonServiceBean.destory() is running."); } // /** // * @return the name // */ // public String getName() { // return name; // } // // /** // * @param name the name to set // */ // public void setName(String name) { // this.name = name; // }
}
4) PersonDao.java:同Setter方法注入
5) PersonDaoImpl.java:同Setter方法注入
6) 测试类(SpringTest.java):同上
Console出现的Log:
PersonServiceBean.init() is running. Name:Jamson PersonDao.add() is running.
三 DI的方式---注解的配置
自从Jdk5中引入Annotation类后,在EJB和Spring中得到广泛的使用,也越来越被开发者们在平时的应用中使用。主要是用在Field上的注入。在日常的应用开发中,一个项目中有很多的bean,如果使用XML文件配置,就会导致配置文件难以管理。使用注解注入的时候,能够使bean的配置文件内容不至于繁杂。
首先介绍下注解的两种方式:@Resource(javax.annotation.Resource)和@Autowired.
@Resource:首先按照名称去寻找当前的bean,如果找不到的话,那就以类型装配。
@Autowired:首先按照类型去寻找当前的bean, 如果找不到的话,那就以名称装配。
1. Resource
下面介绍一个Sample:
1) Beans.xml:
<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean> <bean id="personService" class="com.spring.service.impl.PersonServiceBean" scope="singleton" init-method="init" destroy-method="destory" >
2) PersonService.java:同上。
3) PersonServiceBean.java
public class PersonServiceBean implements PersonService{ //all 需要注入的bean都在这里处理 //使用注解方式注入,首先按名称查找,然后是按照类型查找 @Resource(name="personDao") private PersonDao personDao; public String name="Jamson"; public PersonServiceBean(){ System.out.println("personServiceBean.constructor() is running."); } /** * 使用构造器注入 * @param personDao * @param name */ public PersonServiceBean(PersonDao personDao, String name) { this.personDao = personDao; this.name = name; } // /** // * 使用getter/setter方法注入 // * @return the personDao // */ // public PersonDao getPersonDao() { // return personDao; // } /** * @param personDao the personDao to set */ //使用注解注入到setter方法上,等同于注解注入到Field上。 // @Resource // public void setPersonDao(PersonDao personDao) { // this.personDao = personDao; // } public void save(){ System.out.println("Name:" +name); personDao.add(); } @PostConstruct public void init(){ System.out.println("PersonServiceBean.init() is running."); } @PreDestroy public void destory(){ System.out.println("PersonServiceBean.destory() is running."); } }
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上
2. Autowired
下面介绍一个Sample:
1) Beans.xml:
<bean id="personDao" class="com.spring.dao.impl.PersonDaoImpl"></bean> <bean id="personService" class="com.spring.service.impl.PersonServiceBean" scope="singleton" init-method="init" destroy-method="destory" >
2) PersonService.java:同上。
3) PersonServiceBean.java
public class PersonServiceBean implements PersonService{ //all 需要注入的bean都在这里处理 //使用注解方式注入,首先按名称查找,然后是按照类型查找 @Autowired private PersonDao personDao; public String name="Jamson"; public PersonServiceBean(){ System.out.println("personServiceBean.constructor() is running."); } /** * 使用构造器注入 * @param personDao * @param name */ //public PersonServiceBean(PersonDao personDao, String name) { //this.personDao = personDao; //this.name = name; //} /** * 使用getter/setter方法注入 * @return the personDao */ public PersonDao getPersonDao() { return personDao; } /** * @param personDao the personDao to set */ //使用注解注入到setter方法上,等同于注解注入到Field上。 // @Resource public void setPersonDao(PersonDao personDao) { this.personDao = personDao; } public void save(){ System.out.println("Name:" +name); personDao.add(); } @PostConstruct public void init(){ System.out.println("PersonServiceBean.init() is running."); } @PreDestroy public void destory(){ System.out.println("PersonServiceBean.destory() is running."); }
}
4) PersonDao.java:同上
5) PersonDaoService.java:同上
6) SpringTest.java:同上
Noted:所有的注解可以使用在Field上,也可以使用到Setter方法上,最后结果都是一样的。
四 Java基本类型的注入
Java基本类型的注解可以参考二.2
在beans.xml中配置如下:
<property name="name" value="Jamson"></property>
五 Collection的注入
Collection的注入分为以下两步:
1. Beans.xml:
<property name="sets"> <set> <value>set_1</value> <value>set_2</value> </set> </property> <property name="lists"> <list> <value>list_1</value> <value>list_2</value> </list> </property> <property name="properties"> <props> <prop key="key_1">value_1</prop> <prop key="key_2">value_2</prop> </props> </property> <property name="maps"> <map> <entry key="map_1" value="value-1"/> <entry key="map_2" value="value-2"/> </map> </property>
2. SpringTest.java:
System.out.println("============Set is Starting==========="); for(String value : personService.getSets()){ System.out.println(value); } System.out.println("============List is Starting==========="); for(String value: personService.getLists()){ System.out.println(value); } System.out.println("============Properties is Starting==========="); for(Object key: personService.getProperties().keySet()){ System.out.println(key +"="+ personService.getProperties().getProperty((String)key)); } System.out.println("============Map is Starting==========="); for(String key: personService.getMaps().keySet()){ System.out.println(key +"="+ personService.getMaps().get(key)); }
发表评论
-
OS Workflow Intruction
2011-03-14 01:58 1647OSWorkflow是一个灵活的工作流引擎,设计成可嵌入到企业 ... -
EJB学习之五---MDB(消息驱动EJB)
2010-09-06 13:32 2272前面已经介绍过EJB的Session Bean,这篇文章主要介 ... -
SSL单双向验证原理(转)
2010-06-07 22:34 2897Key points SSL验证 双向SSL ... -
Spring2.5学习之三----AOP研究
2010-05-31 12:09 6475Key Points AOP的基本概念 Advice的类型 A ... -
Spring学习之一----创建Bean的三种方法
2010-05-30 14:29 27663关键字 BeanFactory ApplicationCont ... -
EJB3学习之四----EJB3新特性(元数据注解和依赖注入)
2010-05-13 01:39 4145EJB3新特性 元数据注解 依赖注入 一 EJB3新特性 ... -
Ejb3学习之二----Ejb3的Ejb Bean类型介绍
2010-05-11 23:01 3239关于Ejb3的Ejb bean类型介 ... -
EJB学习之三---Local和Remote接口
2010-05-10 23:12 8228这篇文章主要来学习Ejb的组成元素,重点介绍Local和Rem ... -
Ejb学习之一---EJB3+Jboss4.2配置开发
2010-05-09 02:59 2867昨天,打算把Ejb整理下,最早用到Ejb+Jboss是在三年前 ... -
Struts Taglib库之(一)Bean讲解
2010-05-05 23:29 0最近准备换工作,也想把一些工作中用到的技术进行链接起来,就把它 ... -
转:Hibernate中cascade和inverse的相关
2011-11-19 17:51 648FROM:http://developer.51cto.com ... -
Struts1和Struts2有何不同?
2010-04-19 00:42 0Struts1和Struts2的区别和对比: Action ... -
Struts2中的Vistor模式
2010-04-19 00:40 1513Visitor访问者模式定义 作用于某个对象群中各个对象的操作 ... -
Spring中的Singleton模式和Prototype模式
2010-04-19 00:06 1796对于在Spring+Struts2结合配置Action=&qu ... -
WebService介绍
2010-04-18 17:01 2948记得初次接触WebService是 ... -
Spring中的Singleton模式和Java中的Singleton模式
2010-04-17 17:09 12660对于Spring中实现Singleton模式,是以IOC容器为 ... -
JavaMail来读取和发送邮件的基本流程
2010-04-15 01:21 1918在应用程序中使用JavaMail来读取邮件的基本流程如下: ... -
SSH框架优缺点【转】
2010-04-15 00:53 6131在过去的一年里,可能 ... -
J2EE面试题
2010-04-14 11:17 0一、基础问答 1.下 ... -
JTOM
2010-04-13 00:24 0JTOM是一个基于Java开放源代码的事物处理管理器。它遵 ...
相关推荐
spring2.5学习PPT 传智博客 01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 04_Spring的三种实例化Bean的方式 05_配置Spring管理的bean的作用域 06_Spring...
Spring2.5继续坚持了简化企业级应用开发,同时给复杂问题提供强大的、非侵入性解决方案的发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的...
01_全面阐释Spring及其各项功能 02_搭建与测试Spring的开发环境 03_编码剖析Spring管理Bean的原理 ...07_编码剖析Spring依赖注入的原理 08_编码剖析Spring装配基本属性的原理 09_Spring如何装配各种集合类
<br>新发布的Spring2.5继续坚持了这个发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency ...
依赖注入 依赖项是类的属性(实例变量)(最终成为对对象的引用) 使用 setter 方法或使用构造函数参数注入依赖项。 我们使用定义要注入的依赖项的 xml 配置或注释来定义元数据。 注入依赖的过程称为连接,它将所有...
#Spring 属性注释扩展的 PropertyPlaceHolderConfigurer 使用注解将配置属性注入到 Spring 组件中。 注意:Spring 3 现在支持使用 @Value 注释的容器的。 该项目仅用于 Spring 2.5.x 支持。 ##入门Spring房产注解...
spring依赖注入的最新技术实现 简单易懂,很实用的哟
删除了示例中的jar包,资源太大传不上,该示例采用的目前主流的技术struts2.1+hibernate3.2+spring2.5 的整合开发,示例采用面向接口的设计开发模式,使用spring来管理hibernate的事务,通过依赖注入对struts的...
一个spring2.5+hibernate3.3+struts1.3的整合的完整项目,该项目使用spring容器创建sessionFactory,管理struts ActionBean的创建,其中使用注解的方式创建实体Bean以及依赖注入和事务
<br>新发布的Spring2.5继续坚持了这个发展趋向,特别是为那些使用Java 5或更新版本java的开发人员提供了进一步简化而强大的新特性。这些新特性包括:注解驱动的依赖性注入(annotation-driven dependency ...
本人写的一个小demo,新手可做参考。。老鸟勿视。
-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 --> <context:component-scan base-package="com.baobaotao.web"/> <!-- ②:启动Spring MVC的注解功能,完成请求和注解POJO的映射 --> ...
迷你书是《Spring揭秘》的精选版,节选了原书中介绍Spring IoC容器的6个章节。《Spring揭秘》以幽默生动的语言、辅以有趣的故事和典故,循循善诱地...6.1 Spring 2.5的基于注解的依赖注入 6.2 Spring 3.0展望 6.3 小结
6.8.1. 在Spring中使用AspectJ来为domain object进行依赖注入 6.8.1.1. @Configurable object的单元测试 6.8.1.2. 多application context情况下的处理 6.8.2. Spring中其他的AspectJ切面 6.8.3. 使用Spring IoC来...
1.3 应用控制反转和依赖注入 1.3.1 问题描述 1.3.2 解决方案 1.3.3 实现方法 1.4 理解不同类型的依赖注入 1.4.1 问题描述 1.4.2 解决方案 1.4.3 实现方法 1.5 ...
1.3 应用控制反转和依赖注入 1.3.1 问题描述 1.3.2 解决方案 1.3.3 实现方法 1.4 理解不同类型的依赖注入 1.4.1 问题描述 1.4.2 解决方案 1.4.3 实现方法 1.5 ...
依赖注入和控制反转 1.2。 模块 1.2.1。 核心容器 1.2.2。 数据访问/集成 1.2.3。 web 1.2.4。 AOP和仪表 1 2 5。 测试 1.3。 使用场景 1.3.1。 依赖关系管理和命名约定 Spring依赖和依靠弹簧 Maven依赖管理 艾薇...