Spring详解----个人笔记

来源:互联网 发布:world网络用语什么意思 编辑:程序博客网 时间:2024/04/16 15:00

一、spring_IOC容器

1、spring依赖库
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar

2、拷贝spring配置文件到src下


3、拷贝log4j配置文件到src下

4、在UserManagerImpl中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给

我们

5、让spring管理我们的对象创建和依赖,必须在spring配置中进行定义

6、编写客户端


spring Ioc容器的关键点:
 * 必须将被管理的对象定义到spring配置文件中
 * 必须定义构造函数或setter方法,让spring将对象注入过来

二、spring_属性注入 

1、spring的普通属性注入 

什么是属性编辑器,作用?
 * 自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
 spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
 
 * 如何定义属性编辑器?
  * 继承PropertyEditorSupport类,覆写setAsText()方法,参见:

UtilDatePropertyEditor.java
  * 将属性编辑器注册到spring中,参见:applicationContext-editor.xml
  
依赖对象的注入方式,可以采用:
 * ref属性
 * <ref>标签
 * 内部<bean>来定义
 
如何将公共的注入定义描述出来?
 * 通过<bean>标签定义公共的属性,指定abstract=true
 * 具有相同属性的类在<bean>标签中指定其parent属性
 
 参见:applicationContext-other.xml


三、Bean的作用域

spring Bean的作用域:
 
scope可以取值: 
 * singleton:每次调用getBean的时候返回相同的实例
<bean id="bean1" class="com.bjsxt.spring.Bean1" scope="singleton"/>

 * prototype:每次调用getBean的时候返回不同的实例
<bean id="bean1" class="com.bjsxt.spring.Bean1" scope="prototype"/>

四、根据名称/类型自动装配

applicationContext.xml   标头加default-autowire="byName"


applicationContext.xml   标头加default-autowire="byType"


小结:
IoC就是Inversion of Control,控制反转。在Java开发中,IoC意味着将你设计好的类交给系统

去控制,而不是在你的类内部控制。这称为控制反转。将Bean及其他东东的依赖关系全部注入到

xml文件中。其相当于大型的工厂。


五、spring采用Annotation方法实现AOP

spring对AOP的只是(采用Annotation的方式)

1、spring依赖库
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
 * SPRING_HOME/lib/aspectj/*.jar
 
2、采用Aspect定义切面

2、在Aspect定义Pointcut和Advice

4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中

注意:在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点
即Advice中通过方法名引用这个切人点

AOP:
 * Cross cutting concern
 * Aspect
 * Advice
 * Pointcut
 * Joinpoint
 * Weave
 * Target Object
 * Proxy
 * Introduction

 

六、spring对AOP的只是(采用配置文件的方式)

1、spring依赖库
 * SPRING_HOME/dist/spring.jar
 * SPRING_HOME/lib/jakarta-commons/commons-logging.jar
 * SPRING_HOME/lib/log4j/log4j-1.2.14.jar
 * SPRING_HOME/lib/aspectj/*.jar
2、配置如下
 <aop:config>
  <aop:aspect id="security" ref="securityHandler">
   <aop:pointcut id="allAddMethod" expression="execution(*

com.bjsxt.spring.UserManagerImpl.add*(..))"/>
   <aop:before method="checkSecurity" pointcut-

ref="allAddMethod"/>
  </aop:aspect>
 </aop:config> 
  

spring对AOP的支持

Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必

须实现接口
如果没有实现接口必须引入CGLIB库

我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可

以取得
参数值、方法名等等


spring对AOP的支持

1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间

转换


七、如何强制使用CGLIB实现AOP?
 * 添加CGLIB库,SPRING_HOME/cglib/*.jar
 * 在spring配置文件中加入<aop:aspectj-autoproxy proxy-target-class="true"/>
 
JDK动态代理和CGLIB字节码生成的区别?
 * JDK动态代理只能对实现了接口的类生成代理,而不能针对类
 * CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
   因为是继承,所以该类或方法最好不要声明成final