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