Spring学习笔记(一)

 

Spring的作用:

  • 能够降低组件之间的耦合度,实现软件之间的解耦
  • 可以使用Spring容器的众多服务,比如:事务管理器.当我们使用事务管理器时,开发人员不需要手动控制事务,也不需要处理复杂的事务传播.
  • Spring容器提供单例模式的支持
  • 容器提供了AOP技术,利用它很容易实现如权限拦截、运行期监控等.
  • 容器提供了很多辅助器,这些类能够加快应用的开发,如:JdbcTemplate、HibernateTemplate等.
  • Spring提供了主流应用框架的支持,如:集成Hibernate、JPA、Struts等,便于应用程序的开发

Spring的核心技术是IoC(Inversion of Control)和AOP(Aspect-oriented programming).

IoC还有另一个名字,叫DI(Dependency Injection),称为"依赖注入".所谓依赖注入就是指,在运行期间,由外部容器动态地将依赖对象注入到组件中.

依赖注入有三种方式:

  1. 使用构造器注入
  2. 使用属性setter注入
  3. 使用Field注入(利用注解)

Bean的装配

Spring提供三种实例化Bean的方式:

使用类构造器的方式

<bean id=”唯一标识符” class=”完整类名”></bean>

使用静态工厂的方式

<bean id="唯一标识符"

class="工厂的完整类名" factory-method="需要执行工厂的哪个方法的方法名" />

使用工厂实例的方式

<bean id=“唯一标识符1" class="工厂的完整类名"/>

<bean id="唯一标识符2" factory-bean=“唯一标识符1"

factory-method="需要执行工厂的哪个方法的方法名" />

Bean在实例化的时候默认只有一个,不管获得几次,都是同一个Bean,不过Spring提供了修改Bean作用域的属性,有几种取值:

singleton,prototype,request,session,global session.有几个都没什么用.

除了配置的注入方式以外,还可以使用注解的方式进行注入,在JAVA代码中使用@Autowired或@Resource注解方式进行装配.不过在装配之前,需要引入context命名空间,虽然Spring支持注解的解析,但是默认解析的"开关"没有打开,必须在配置文件里添加<context:annotation-config />标签,这个标签隐式的注册了Spring对注解进行解析的处理器:

AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,

PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor

@Autowired可以作用在构造器、字段和方法上,默认以类型进行查找,默认情况下它要求的依赖对象必须存在,如果可以允许不存在,则需要设置它的required属性值为false.如果想以名称进行查找,可以结合@Qualifier注解一起使用,如@Autowired @Qualifier("指定名称").@Qualifier注解还可以指定在构造器或者方法的参数在,如:

@Autowired 
public void setPersonDao(@Qualifier("personDao") PersonDao personDao) {//用于属性的set方法上 
      this.personDao = personDao; 
}

@Resource可以作用在类、方法和字段上,默认以名称进行查找,如果找不到相应的Bean,则以类型进行查找.如果指定了name属性,则只按名称进行查找.

另外,Spring还支持Bean的自动装配:

<bean id=“foo” class=“...Foo”  autowire=“autowire type”>

autowire的取值包含(byType,byName,constructor,autodetecte),只用了解就行了,不常用,以免出现不可预知的后果.

此外,项目中通常会有上百个组件,如果这些组件全部采用在配置文件中通过Bean的方式来配置,则会明显增加配置文件的体积,查找和维护起来也会相关不便.所以,Spring2.5提供了自动扫描组件的方式来配置组件,它通过在类路径下寻找标了@Component、@Service、@Controller和@Repository注解的类,并把这些类纳入到Spring的容器中进行管理.

要使用自动扫描机制,需要引入context命名空间,并且需要在配置文件里面加上:

<context:component-scan base-package="包名"/>.

这个标签将扫描指定包(含子包)下的所有组件.并且把AutowiredAnnotationBeanPostProcessor 和CommonAnnotationBeanPostProcessor隐式地被包括进来以进行注解解析.

AOP--面向切面编程

AOP代理对象

如果目标对象实现了接口,则代理对象也实现同样的接口,否则使用cglib代理,则Spring有两种代理方式:

  1. 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
  2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。

备注: 

对接口创建代理优于对类创建代理,因为这将产生更加松耦合的系统.

标记为final的方法无法得到通知,Spring需要为目标类产生子类,需要覆写被通知的方法,然后将通知织入.final方法不允许被覆写.

 

 

 

 

AOP中有几个概念,这些概念我们经常会用到,大数人也经常在程序中写出来,但是自己不知道:

Jointpoint(连接点)

连接点就是被拦截到的那个点,在Spring中,"点"指的是方法,因为Spring只支持方法类型的连接点.也就是说,哪个方法现在被拦截到了,我们就把这个方法称为连接点.

Pointcut(切入点)

切入点就是我们要拦截哪些连接点.比如你的工作是查水表,你负责的那个区域就是切入点,你现在正在查的那家,就是连接点.

Advice(通知)

通知就是拦截到连接点之后要做的事情,比如乘地铁,你不带包就不用安检,如果你带了包,就要安检(被拦截到了),然后X射线检查你的包就是一个通知.通知分为:前置通知,后置通知,最终通知,异常通知,环绕通知五种.

Aspect(切面)

是通知和切入点的结合,通知和切入点共同定义了关于切面的全部内容---它的功能、在何时和何地完成其功能,简单的说,通知所在的类,并且定义了切入点,那么这个类就是切面.

Target(目标对象)

需要代理的对象.

Weaving(织入)

把切面应用到目标对象来创建一个代理对象的过程就叫织入.

Introduction(引入)

引入就是在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.

 

更多信息请查看 java进阶网 http://www.javady.com

你可能感兴趣的:(spring)