Spring in Action入门之装配管理Bean
2013-02-15 18:42
489 查看
(该部分是Spring的入门和Spring容器装配管理Bean的方法)第一章 开始Spring之旅Applet可以用来创建动态的Web应用,在html文件中通过<applet>标识,一种已经被淘汰的技术。
AOP(Aspect Oriented Programming,面向切面):通过将业务逻辑从应用服务中分离出来,实现了内聚开发。(比如:开发者可以先专注开发一个裸系统,然后再加上用户系统,如Spring Security)
Spring容器:可以通过配置来设定你的Bean是单一实例,还是每次请求产生一个实例,用容器去管理应用对象的生命周期和配置。scope="singleton"单实例模式,默认配置; scope="prototype" 每次请求都会创建一个实例。
配合Struts2时候要配置scope="prototype" ,因为Struts2中的Action是非单例的,每次请求都会创建一个新的Action,让Struts2的Action由Spring创建,Spring默认创建出的对象都是单实例的,要加上scope="prototype",让spring每次请求创建一个实例。
如果响应类中没有成员变量,那么单例模式是线程安全的,否则需要对全局变量做保护,信号量控制。
第2章 基本Bean装配2.1 容纳你的BeanSpring的容器:Bean工厂 and 应用上下文BeanFactory:
常用的是根据XML文件中的定义装载Bean,比如:
也有诸多实现,比如ClassPathXmlApplicationContext
2.2 创建Bean两种方式:通过构造函数注入依赖,优点少些了Setter代码,强制使用强依赖契约,因为如果没有提供所有需要的依赖,一个Bean就无法被实例化了。
Spring配置基本类型(通过value)和其他类(通过ref),但value和ref只有在属性是单一的时候才有效。那么当属性是复数(就是集合)时,Spring怎么做呢?
Spring装配支持的集合类型:<list> <set> <map> <props>,常用<list>,<map>
2.4 自动装配四种自动装配的类型,byName byType constructor autodetect,自动装配虽然节省了XML代码,但是也带来了很多问题,比如属性名字设计时候相当小心,重构代码时候要连带修改,自动装配的最大缺点就是缺乏透明,一般不采用这个Spring IOC的自动装配特性。2.5 控制Bean创建初始化和销毁Bean,两种方式:在声明<bean>的时候加上init-method和destroy-method参数,指定在Bean初始化的时候调用的方法。(推荐使用)
java实现类的时候,实现InitializingBean和DisposableBean的afterPropertiesSet和destory方法,spring会允许它们勾入到Bean的生命周期中。(缺点:应用Bean和Spring API相互耦合)
第三章 高级Bean装配3.1Spring配置实现继承为了实现Bean的继承,<bean>元素提供了两个特殊属性:parent:指明Bean的id。他对于<bean>的作用就相当于关键字extents对于Java类的作用。
abstract:如果设置为true,就表示<bean>声明是抽象的,不能被Spring实例化。
获取器注入<lookup-method>
把一个方法(一般是抽象的)声明为返回某种类型的Bean
3.3脚本化Bean(Ruby Groovy BeanShell)比如Ruby的实现:
<applet code="Bubbles.class" width="350" height="350"> Java applet that draws animated bubbles. </applet>POJO实质上可以理解为简单的实体类,如果项目中使用了Hibernate框架,有一个关联的***.hbm.xml文件,就可以使对象与数据库中的表对应。负责轻量级POJO开发就是Spring框架,由此引入Spring。。。1.1 Spring是什么?Spring是一个轻量级的DI和AOP容器框架,目标:高内聚、松耦合。DI(Dependency Injection,依赖注入):对象不是从容器中查找它的依赖类,而是容器在实例化对象的时候主动将它的依赖类注入给它。
AOP(Aspect Oriented Programming,面向切面):通过将业务逻辑从应用服务中分离出来,实现了内聚开发。(比如:开发者可以先专注开发一个裸系统,然后再加上用户系统,如Spring Security)
Spring容器:可以通过配置来设定你的Bean是单一实例,还是每次请求产生一个实例,用容器去管理应用对象的生命周期和配置。scope="singleton"单实例模式,默认配置; scope="prototype" 每次请求都会创建一个实例。
配合Struts2时候要配置scope="prototype" ,因为Struts2中的Action是非单例的,每次请求都会创建一个新的Action,让Struts2的Action由Spring创建,Spring默认创建出的对象都是单实例的,要加上scope="prototype",让spring每次请求创建一个实例。
如果响应类中没有成员变量,那么单例模式是线程安全的,否则需要对全局变量做保护,信号量控制。
<bean id="adTagFacade" class="outfox.ead.adbrand.domain.impl.AdTagFacadeImpl" scope="singleton"> <property name="adTagDao" ref="adTagDao" /> </bean>1.2 开始Spring之旅还是从Hello World!开始~
<bean id="greetingSerivice" class="com.springinaction.hello.GreetingServiceImpl"> <property name="greeting" value="Hello World!"/> </bean>通过配置<bean>元素中的<property>设置属性值,告诉Spring容器通过调用Bean的setGreetring方法设置其属性值,(BeanFactory)factory.getBean("greetingService")的时候实例化类,同时注入greetring的值,最后打印出来。1.3 理解依赖注入耦合是一个双头怪物,一方面,紧密耦合的代码难以测试,难以重用难以理解,带来典型的“摧毁大堤”bug。另一方面,完全没有耦合的代码什么也做不了。耦合是必须的,但需要小心管理。减少耦合的一个通常的做法是将具体实现隐藏在接口下面,这样具体实现的替换不会影响到引用类。DI的全部:简言之,协调依赖对象之间合作的责任从对象自身中转移出来。(通过XML配置,Spring容器去管理)1.4 应用AOPDI是软件组件松散连接成为可能,AOP让你能够捕捉应用中经常使用的功能,把它转化为可重用组件。以下是将log转化成了切面:
<aop:config> <aop:aspect ref="log"> //声明一个切面,log提供了该切面的功能,这里是一个普通的bean。 <aop:pointcut id="pointCut" expression="excution(*.doTask(..))"/> //切面的切入点,执行doTask可以出发该切入点 <aop:before method="doTaskBefore" pointcut-ref="pointCut"/> //log下的doTaskBefore方法应该在切入点之前调用,下同 <aop:after-returning method="doTaskAfter" pointcut-ref="pointCut"/> </aop:aspect> </aop:config>
第2章 基本Bean装配2.1 容纳你的BeanSpring的容器:Bean工厂 and 应用上下文BeanFactory:
常用的是根据XML文件中的定义装载Bean,比如:
BeanFactory factory = new XMLBeanFactory(new FileSystemResource("c:/beans.xml"));Bean是被延迟载入到Bean工厂中的,就是说Bean工厂会立即把Bean定义信息载入进来,但是Bean只有在被需要的时候才被实例化。为了从BeanFactory得到一个Bean,只要简单的调用getBean()方法。
MyBean myBean = (MyBean) factory.getBean("myBean");工厂就会实例化Bean并且使用依赖注入设置Bean的属性。应用上下文:
也有诸多实现,比如ClassPathXmlApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");应用上下文ApplicationContext接口扩展自BeanFactory接口,一个重要的区别是关于单实例Bean是如何被载入的。应用上下文会在上下文启动后预载入所有的单实例Bean。通过预载入单实例Bean,确保当你需要的时候它们已经准备好了,你的应用不需要等待它们被创建。注意区别:应用上下文比起Bean工厂提供了一些附加功能,几乎所有的应用系统都选择ApplicationContext而不是BeanFactory,只有在资源很少的情况下,才会考虑采用Beanfactory,如在移动设备上。
2.2 创建Bean两种方式:通过构造函数注入依赖,优点少些了Setter代码,强制使用强依赖契约,因为如果没有提供所有需要的依赖,一个Bean就无法被实例化了。
<bean id="duke" class="com.springinaction.springidol.ProticJuggler"> <constructor-arg value="15"/> <constructor-arg ref="sonnet29"/> </bean>Setter方法注入依赖,优点当依赖很多的时候,比较灵活。利于自身的继承。因为构造函数是不能被继承的。子类只能调用super()方法给父类的私有变量赋值。(推荐)
<bean id="duke" class="com.springinaction.springidol.ProticJuggler"> <property name="beanBags" value="15"> </bean>2.3 注入Bean属性内部Bean,一种注入依赖Bean的方式,但是无法复用,内部Bean只用于注入,且不能被其他Bean所引用。
一般写法: <bean id="piano" class="com.springinaction.springidol.Piano"/> <bean id="kenny" class="..."> <property name="instrument" ref="piano"> </bean> 若要用内部类如下: <bean id="kenny" class="..."> <property name="instrument"> <bean class="om.springinaction.springidol.Piano"> </property> </bean>
Spring配置基本类型(通过value)和其他类(通过ref),但value和ref只有在属性是单一的时候才有效。那么当属性是复数(就是集合)时,Spring怎么做呢?
Spring装配支持的集合类型:<list> <set> <map> <props>,常用<list>,<map>
List:属性可重复,对应java里的collection,常用 <property name="instruments"> <list> <ref bean="guitar"> <ref bean="cymbal"> </list> </property> Set:属性不重复 <property name="instruments"> <set> <ref bean="guitar"> <ref bean="cymbal"> <ref bean="cymbal"> //自动忽略重复的属性 </set> </property> Maps:key-value的映射,常用 <property name="instruments"> <map> <entry key="GUITAR" value-ref="guitar"> <entry key =......> </map> </property> Properties:配置String-to-String的映射 <property name="instruments"> <props> <prop key="GUITAR">STRUM STRUM STRUM</prop> <prop key="CYMBAL">CRASH CRASH CRASH</prop> </props> </property>
2.4 自动装配四种自动装配的类型,byName byType constructor autodetect,自动装配虽然节省了XML代码,但是也带来了很多问题,比如属性名字设计时候相当小心,重构代码时候要连带修改,自动装配的最大缺点就是缺乏透明,一般不采用这个Spring IOC的自动装配特性。2.5 控制Bean创建初始化和销毁Bean,两种方式:在声明<bean>的时候加上init-method和destroy-method参数,指定在Bean初始化的时候调用的方法。(推荐使用)
java实现类的时候,实现InitializingBean和DisposableBean的afterPropertiesSet和destory方法,spring会允许它们勾入到Bean的生命周期中。(缺点:应用Bean和Spring API相互耦合)
第三章 高级Bean装配3.1Spring配置实现继承为了实现Bean的继承,<bean>元素提供了两个特殊属性:parent:指明Bean的id。他对于<bean>的作用就相当于关键字extents对于Java类的作用。
abstract:如果设置为true,就表示<bean>声明是抽象的,不能被Spring实例化。
<bean id="baseBean" class="..." abstract="true"> <property name="" ref="" /> </bean> <bean id="childBean" parent="baseBean" />3.2 方法注入(不常用)基本方法替换<replaced-method>
获取器注入<lookup-method>
把一个方法(一般是抽象的)声明为返回某种类型的Bean
public abstract Instrument getInstrument(); xml配置覆盖: <lookup-method name="getInstrument" bean="guitar"> //这就类似如下的java代码 publc Instrument getInstrument() { ApplicationContext ctx = ...; return (Instrument) ctx.getBean("guitar"); }
3.3脚本化Bean(Ruby Groovy BeanShell)比如Ruby的实现:
<lang:jruby id="lime" script-source="classpath:com/springinaction/scriptring/Lime.rb" script-interfaces="com.springinaction.scripting.Lime" />使用脚本实现特定代码,而不是用静态编译的Java编写它的一个最大好处在于,我们可以随时修改它,而不必重新编译或重新部署程序。当然取决于Spring刷新脚本的频率refresh-check-delay
相关文章推荐
- Spring in Action入门之装配管理Bean
- Spring in action 03 -- 装配 Bean(xml配置)
- Spring in action 02 -- 装配 Bean(JavaConfig)遇到的问题
- Spring in action 01 -- 装配 Bean(@Autowired)
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除bean自动装配的歧义@Primary
- xml形式装配bean——spring in action chapter 2
- Spring in Action(第二章 装配 Bean)学习笔记
- spring in action-装配Bean
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-004-消除BEAN自动装配的歧义@QUALIFIER及自定义注解
- Spring in Action 学习笔记—第二章装配Bean
- Spring In Action(二):基于XML配置装配bean
- Spring In Action(一):基于注解装配bean
- 【Spring in action】自动化装配Bean、通过Java代码及xml装配Bean
- Spring In Action 01 ---装配Bean
- (Spring In Action)bean注入类型的限定
- SpringInAction 学习笔记:高级装配
- spring入门(7)---装配Bean中构造参数的注入
- SPRING IN ACTION 第4版笔记-第一章-004-用类来管理DI
- SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-007-给BEAN运行时注入值placeholder、@Value
- Spring入门 Bean装配之Aware接口