Spring2.5 学习笔记

实例化容器

1、使用静态工厂方法实例化,factory-method指定的必须是个静态方法

<bean id=”” class=””factory-method =”createInstance”/>

2、使用实例工厂方法实例化,factory-name工厂bean 名称,代替class属性,class属性必须为空,factory-method指定工厂方法

<bean id=”ex”factory-name=”myFactory” factory-method=”createInstance”/>

 

依赖注入

1、ApplicationContext是将所有bean实例化,然后在缓存中读取,开始占用时间长,并能检查出配置文件中的错误。BeanFactory是在调用时才产生bean。

2、默认情况下,bean的scope=”singleton”,内部bean总是匿名而且prototype。Bean或Beans的属性默认default-lazy-init=“false”,spring默认加载配置文件时,默认全部加载,设置为“true”只加载调用部分。

3、<idref>标签用来将容器内其他的id传给<constructor-arg>或<property>,同时提供错误验证功能,允许在容器部署时,验证所被应用的bean是否存在。

4、<ref>标签用来将bean中指定属性的值设置为容器中另一个bean的引用。

l  <ref  bean=”someBean”/>引用同一容器或父容器内的任何bean,bean属性既可以指定bean的id值也可以是name值。

l  <ref  local=”someBean”/>引用同一配置文件中的bean,local属性必须指定bean的id值。

l  <ref  parent=”someBean”/>引用当前容器的父容器中的bean,parent属性可以是bean的id值也可以是name值。

5、将公共的属性定义描述抽取出来:

l 定义公共的注入属性,通过<bean>标签定义,指定abstract=”true”,如<bean id=”comm” abstract=”true”><property>……

l 具有相同注入属性的类,指定parent属性

6、集合:<list><set><map><props>可以定义和设置List、Set、Map、Properties数组对应于<list>标签。

7、集合合并:子集合从父集合继承和覆盖而来,子集合的元素值将覆盖父集合中对应的值。merge=true  属性将父子集合合并。继承需要parent属性。

8、方法注入:如singleton类型的beanA某个方法需要引用另一个非singleton类型beanB时,beanA只会创建一次,这样就没法让A每次创建一个新的B。

l  Lookup方法注入:利用spring IoC容器复写bean的抽象或具体方法的能力,从而返回指定名字的bean实例。内部机制是通过CGLIB库的运行时生成二进制代码功能,通过动态创建Loopup方法bean的子类而达到复写Lookup方法的目的。<lookup-method name=””bean=””/>

l  自定义方法:继承MethodReplacer接口,实现reimplement方法,

<bean id=”replacementClass”class=”ReplacementClass”/>

<replaced-methodname="重写的方法名" replacer="replacementClass">

<arg-type>String</arg-type>

</replaced-method>

9、作用域与依赖:如在singleton的beanA中引用一个session的beanB,这样初始化时,beanA中始终调用的只是开始初始化的那个beanB,而通过动态代理,就可以引用实际运行的那个session中的beanB。在beanB中加入<aop:scoped-proxy>,对该bean提供动态代理,beanA再引用时,实际调用代理对象的方法,随后代理对象会在session中获取真正的beanB对象,并将方法调用委派给获取到的实际beanB对象。<aop:scoped-proxy>不能和singleton或prototype的bean一起使用。

10、           Bean的生命周期:

l  bean的构造函数

l  调用setxxx()方法设备bean属性

l  调用BeanNameAware的setBeanName()方法

l  调用BeanFactoryAware的setBeanFactory()方法

l  调用BeanPostProcessor的postProcessBeforeInitialization()方法

l  调用InitializingBean的afterPropertiesSet()方法

l  调用自定义的初始化方法 init-method=“xxx”

l  调用BeanPostProcessor的postProcessAfterInitialization()方法

l  调用DisposableBean的destroy()方法

l  调用自定义的销毁方法 destroy-method=“xxx”

11、           在非web应用中优雅地关闭SpringIoC容器,以及所有由单例持有的资源都会被释放,为了注册“关闭钩子”,你只需要简单地调用在AbstractApplicationContext实现中的registerShutdownHook()方法即可

12、           国际化:当一个ApplicationContext被加载时,它会自动在context中查找已定义为MessageSource接口类型的bean。此bean的id名称必须为messageSource,实现类ResourceBundleMessageSource,可以配置String bansename或者String[]basenames。

13、           属性编辑器

       作用:属性编辑器,是将spring配置文件中字符串转换成对象进行注入

               Spring内置许多属性编辑器,也可以自定义属性编辑器。

定义:继承PropertyEditerSupport类,重写setAsText()方法,方法最好将对象setValue()中,属性编辑器注册到spring中,定义如下:

<!-- 注册属性编辑器 -->

      <beanid="customEditorConfigurer"class="org.springframework.beans.factory.config.CustomEditorConfigurer">

             <propertyname="customEditors">

                    <map>

                           <entrykey="java.util.Date">

                                  <beanclass="com.spring.util.UtilDatePropertyEditor">

                                         <propertyname="format" value="yyyy/MM/dd"/>

                                  </bean>

                           </entry>

                    </map>

             </property>

           </bean>

 

Spring2.5新特性

@Autowired 自动注入,byType

@Qualifier(“name”) 将自动注入变成byName,只能和@Autowired结合使用,是对@Autowired的补充。自定义的限定器注解,定义一个注释时提供@Qualifier注释就可以了。

       <context:annotation-config/>

 

 

 

 

 

 

 

AOP:切面默认情况不需要接口

1、目的对象为接口,则使用JDK的动态代理机制实现AOP。

2、目标对象为类或者接口,可以强制使用Spring采用CGLIB实现代理。引入CGLIB库,并且设置属性proxy-target-class="true"。Spring会自动在CGLIB和JDK动态代理之间切换。

JDK代理和CGLIB生成代理区别:

       1、JDK只能针对接口生成动态代理,不能针对类

        2、CGLIB针对类实现代理,主要是生成指定类的子类,并覆盖其中方法实现类增强,因为采用的是继承,所以无法对final的类或方法实现代理。

 

切面的三种方式:

注意:1、2两种方法可以在Advice中加入JoinPoint参数,该参数Spring会自动传入,可以从JoinPoint中取出目标对象相关信息,如:getThis()返回代理对象,getTarget()返回目标对象,getArgs()返回连接点方法的参数

1、通过注释方式编写切面方式

* 声明切面@Aspcet

* 定义切入点和切入点表达式@Pointcut(“execution(...)”)

       1.切入点表达式通配符

       “*”匹配所有除了“.”以为的字符,一般匹配单个包、方法、参数等

       “..” 匹配所有字符,一般用于匹配多个包、参数;

       “+”表示类及子类。

       2.切入点关键字

 within 用于匹配连接点所在的java类或者包,它定义的某个包及其子包中所有类的方法都会被匹配

this 可以向通知方法中传入代理对象的引用;

 target 可以向通知方法中传入目标对象的引用;

 args

 bean spring2.5新增,通过受管bean的名字来限定连接点所在的bean @within匹配在类一级使用了参数确定的注解类,其所有方法将被匹配

 如@Before(“@within(MyPointcut)”) utoint()visorAutoProxyCreator被MyPointcut注释的类将被匹配

 @targer和@within类似,但必须指定注解类的保留策略为runtime

 @arg 传入连接点的参数类型必须被@arg指定的注解类注解才被匹配

 @annotation 任何一个执行方法有该注释的连接点

* 定义Advice

       1.前置通知@Before在连接点被调用之前触发

       2.后置通知@AfterReturning连接点返回后被触发,但非正常返回或抛出异常将不被触发;returning属性用来绑定连接点方法的返回值,advice中必须有以以个名字和绑定参数名字相同的参数,返回值会被传到advise中

       如:@AfterReturning(pointcut=”poinrcut()”,returning=”return”)

              publicvoid afterReturning(Object return)

       3.@AfterThrowing在连接点抛出异常时被触发。throwing属性可以得到连接点中抛出的异常,该异常将作为参数传入advise,只有异常与advise异常参数类型一致时才会触发该通知;

       4.最终通知@After不论一个方法是如何结束的,最终通知都会运行,最终通知必须准备处理正常返回和异常返回两种情况。通常用来释放资源。

       5.环绕通知@Around advise第一个参数必须是ProceedingJoinPoint,并且需要执行该参数的proceed方法来调用连接点方法,proceed可以调用零次或多次。

* 在Spring配置文件中添加<aop:aspectj-autoproxy/>,让Spring启用AspectJ的Annotation支持并自动产生代理,定义Aspect目标类的<bean>

注意:在这种方法中,切入点的方法是不被执行的,他存在的目的仅仅为了重用切入点的定义(即可以在advice中,通过方法名称引用在个切入点)

2、通过xml配置方式(在xml配置中,逻辑运算分别要用“and”“or”“not”)

<aop:config>

              <aop:aspectid="securityAspect" ref="security">

                     <aop:pointcutid="allAdd" expression="execution(* add*(..))"/>

                     <aop:beforepointcut-ref="allAdd" method="checkSecurity"/>

                     <aop:afterpointcut="execution(* add*(..))"method="checkSecurity2"/>

<aop:after-returning pointcut-ref=""method="" returning=""/>

<aop:after-throwing pointcut-ref=""method="" throwing=""/>

<aop:around pointcut-ref=""method=""/>

              </aop:aspect>     

              …

       </aop:config>

       引用另一个切入点(要用全路径标识引用的切入点)

       <aop:pointcut id="test"expression="aop.test.MyAspect.Pointcut()"/>

      

3、配置代理方式

* 配置Spring代理

1.ProxyFactoryBean:proxyInterfaces属性指定代理接口,target指定代理类,interceptorNames属性指定通知或者通知者列表;

2.BeanNameAutoProxyCreator:通过bean的name属性来指定代理的bean,其中beanNames属性指定代理bean的名称列表,支持“*”通配符,interceptorNames指定通知或者通知者列表;

3.DefaultAdvisorAutoProxyCreator允许只定义相应的通知者,就可以完成自动代理,它会自动查找配置文件中的Advisor并将他们作用与所有bean。

 

* 指定通知者

1、DefaultPointAdvisor:默认的通知者,默认会将切入点包括类所有方法,支持所有Piontcut,功能最强大;

2、NameMatchMethodPointcutAdvisor:内置它的Advisor使用它可以不必单独再配置NameMatchMethodPointcut,mappedName和mappedNames属性定义切入点中的方法,order属性定义加载顺序;

3、RegexpMethodPointcutAdvisor:内置了JDK正则表达式切入点的JdkRegexpMethodPointcut的Advisor,advice属性指定Advice方法,pattern属性指定匹配模式

Spring的五种通知方式

1.前置通知:实现接口MethodBeforeAdvice的before方法;

2.后置通知:实现接口AfterReturningAdvice的afterReturning方法;

3.环绕通知:实现接口MethodInterceptor的invoke方法,其中必须调用MethodInvocation的proceed方法,来执行目标对象的方法;

4.异常通知:实现ThrowsAdvice标志接口,实现类必须要有一个异常处理方法,格式:void afterThrowing(Method method,Object[] args,Objectarg,Throwable th)      其中前三个参数可以选,Throwing是必须的,springAOP会自动选择重载方法:                              voidafterThrowing(RuntimeException re)  

        void afterThrowing(RemoteExceptions re)  …

5.引介通知:是类级别的通知,能将新的成员变量、成员方法引入到目标类中,spring推荐扩展类DelegatingIntroductionInterceptor来定义自己的引入通知,它IntroductionInterceptor接口的invoke方法,如需要重写该方法获得目标对象的方法、参数和返回值等,使用return super.invoke0就可以实现该功能。引入通知只能和它的专有通知者IntroductionAdvisor一起使用,而不兼容其他通知者,因为他应用在类级别其他通知应用在方法级别,spring提供了实现类DefaultIntroductionAdvisor。

 

 

 

 

 

 

事务管理

1、使用资源同步事务

l 高层次方案:采用模板方法HibernateTemplate

l 低层次方案:SessionFactoryUtils(针对Hibernate)等

2、声明式事务管理:通过Spring AOP实现的;声明式事务管理可以在任何环境下使用,只需更改配置文件;Spring允许通过AOP定制事务行为,可以在事务回滚中插入定制的行为,可以增加任意的通知,就象事务通知一样。

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值