Spring个人学习笔记
- 格式:doc
- 大小:297.50 KB
- 文档页数:23
Spring_beginning
Spring最常用的特性
利用Spring来创建对象(JavaBean工厂)
利用Spring构建业务逻辑层
管理依赖关系
适应需求变更
利用Spring创建数据访问对象(DAO)
利用Spring进行事务处理
环境搭建
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下
applicationContext.xml
3、拷贝log4j配置文件到src下
log4j.properties
4、在UserManagerImpl中提供构造函数或setter方法,spring将实例化好的UserDao实现注入给我们
5、让spring管理我们的对象创建和依赖,必须在spring配置中进行定义
6、编写客户端
//获取BeanFactory
BeanFactory factory =
new ClassPathXmlApplicationContext("applicationContext.xml");
//从容器中获取userManager对象
UserManager userManager = (UserManager)factory.getBean("userManager");
userManager.save("伟超", "1234");
spring Ioc容器的关键点:
* 必须将被管理的对象定义到spring配置文件中
* 必须定义构造函数或setter方法,让spring将对象注入过来
只需改动ApplicationContext.xml的配置,即可实现实际功能的切换
IOC/DI
控制反转(Inversion of Control,IoC)与依赖注入(Dependency Injection)
由容器来管理对象之间的依赖关系(而不是对象本身来管理),就叫“控制反转”或“依赖注入”
以上代码,已清楚阐述IOC/DI出现的原因,以及IOC的基本原理
Spring框架的基本思想就是IOC/DI
Spring就是一个IOC容器
IOC与DI,说的是一回事,但DI这个名词更能表达这种设计模式的思想
依赖注入的类型
构造器注入
通过类的构造方法注入依赖关系
设值方法注入
通过类的setter方法注入依赖关系
第三种:接口注入(不常用)
定义一个注入接口,在需要注入的类中实现此接口,由于这种方法具有侵入性,所以不常用
2. Injection
2.1 spring的普通属性注入
参见:spring文档3.3章节
2.2 什么是属性编辑器,作用?
2.2.1 自定义属性编辑器
自定义属性编辑器:spring配置文件中的字符串转换成相应的对象进行注入
心得:从此处可以看出,spring里面输入的都是字符串,但是可以更根据POJO设置的类型做相应的转换
spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
2.2.2 如何定义属性编辑器?
①继承PropertyEditorSupport类,覆写setAsText()方法,参见:UtilDatePropertyEditor.java
SimpleDateFormat sdf = new SimpleDateFormat(format);
setValue(d);
②将属性编辑器注册到spring中,参见:applicationContext-editor.xml
class="org.springframework.beans.factory.config.CustomEditorConfigurer">
yyyy/MM/dd
2.3 依赖对象的注入方式
* ref属性
* 标签
* 内部来定义
如何将公共的注入定义描述出来?
* 通过标签定义公共的属性,指定abstract=true
* 具有相同属性的类在标签中指定其parent属性
参见:applicationContext-other.xml 2.4 spring Bean的作用域:
scope可以取值:
* singleton:每次调用getBean的时候返回相同的实例
* prototype:每次调用getBean的时候返回不同的实例
3 Spring 对AOP(Aspect Oriented Programming)的支持
3.1 AOP相关
AOP的关注点是Cross cutting concern,比如下面的检查安全性,在通过配置关注点,可以不影响主程序,Aspect包含Pointcut(切入点注册)和advice(具体怎么切、实现)
3.2 采用Annotation的方式
3.3.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
SecurityHandler.java(2、3、4)
3.3.2 采用Aspect定义切面
@Aspect
public class SecurityHandler {
@Pointcut("execution(* add*(..))")
private void allAddMethod(){};
@Before(value="allAddMethod()") private void checkSecurity() {
System.out.println("----------checkSecurity()---------------");
}
}
3.3.3 在Aspect定义Pointcut和Advice
/**
* 定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,
* 该方法只是一个标识
* Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)
*/
@Pointcut(value="execution(* add*(..))")
private void allAddMethod(){};
/**
* 定义Advice,标识在那个切入点何处织入此方法
*/
@Before(value="allAddMethod()")
private void checkSecurity() {
System.out.println("----------checkSecurity()---------------");
}
3.3.4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中
即Advice中通过方法名引用这个切人点
Client.java
UserManager userManager = (UserManager)factory.getBean("userManager");
AOP:
//这两个方法执行之前就会执行advice;
userManager.addUser("张三", "123");
userManager.deleteUser(123);
* Cross cutting concern
* Aspect
* Advice
* Pointcut
* Joinpoint
* Weave
* Target Object
* Proxy
* Introduction