SpringIOC和AOP简单概述

Spring学习:主要学习两大块IOC   AOP

一、IOC

 

  1. IOC:控制反转(也可以叫做依赖注入)的基本认识:

 

当某个Java对象(调用者)需要调用另一个Java对象(被依赖对象)的方法时,调用者无需主动获取被依赖对象,调用者只要被动接受Spring容器为调用者的成员变量赋值即可。由此可见,调用者获取被依赖对象的方式由原来的主动获取,变成了被动接受。

依赖注入:从Spring容器的角度来看,Spring容器负责将被依赖对象赋值给调用者的成员变量——相当于为调用者注入它依赖的实例,因此称之为依赖注入。

 

  1. 依赖注入两个方法:

 

1)设值注入(setter)property:成员变量的setter方法来注入被依赖对象,在Spring的依赖注入里大量使用。

例如:

要注入的对象 :

package com.yc.pojo;
 
import java.io.Serializable;
 
public class Student implements Serializable{
    private static final long serialVersionUID = 1L;
    private Integer sid;
    private String name;
    public Student() {
//        System.out.println("学生对象创建了");
    }
    public Student(Integer sid, String name) {
//        System.out.println("学生对象创建了");
        this.sid = sid;
        this.name = name;
    }
    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "Student [sid=" + sid + ", name=" + name + "]";
    }
    
}

set方法注入

 <bean id="stu1" class="com.yc.pojo.Student" scope="prototype">
           <property name="sid" value="1001"></property>
           <property name="name" value="张三"></property></bean>

 

2)构造注入constructor-arg:驱动Spring在底层以反射方式执行带指定参数的构造器,当执行带参数的构造器时,就可利用构造器参数对成员变量执行初始化——这就是构造注入的本质。


例如:

直接来个角色bean

public class Roles {
    private int id;
    private String roleName;
    
    public Roles() {
    }
    public Roles(int id,String roleName) {
        this.id=id;
        this.roleName = roleName;
    }
    @Override
    public String toString() {
        return "Users [id=" + id + ", name=" + roleName + "]";
    }
}

spring配置

    <bean id="roles" class="cn.com.ztz.spring.model.Roles">
        <constructor-arg value="1"/>
        <constructor-arg value="管理员"/>
    </bean>

在运行我们的测试方法

public class SpringTest {
    public static void main(String[] args) {
        ApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
        Roles u = (Roles)context.getBean("roles");
        System.out.println(u.toString());
    }
}

 

 

注:建议采用设值注入为主,构造注入为辅的注入策略。对于依赖关系无须变化的注入,尽量采用构造注入;而其他依赖关系的注入,则考虑采用设值注入。

 

  1. Spring中的bean

 

1)概念:

对于开发者来说,使用Spring框架主要是做两件事:①开发Bean;②配置Bean。

对于Spring框来说,是根据配置文件创建Bean实例,并调用Bean实例的方法完成"依赖注入"。

 

2)容器中Bean的作用域:

  1. singleton: 单例模式,只生成一个实例。
  2. Prototype:通过容器的getBean()方法获取prototype作用域的Bean
  3. request: 对于一次HTTP请求,只有在Web应用中使用Spring时,该作用域才真正有效。
  4. session:该作用域将 bean 的定义限制为 HTTP 会话。只在web-aware Spring ApplicationContext的上下文中有效。
  5. global session: 每个全局的HTTP Session对应一个Bean实例。同样只在Web应用中有效。

 

3)自动装配注入合作者Bean

Spring容器检查XML配置文件内容,为调用者Bean注入被依赖的Bean。

Spring自动装配可通过

<beans/>元素的default-autowire属性指定,该属性对配置文件中所有的Bean起作用;

也可通过对<bean/>元素的autowire属性指定,该属性只对该Bean起作用。

当一个Bean既使用自动装配依赖,又使用ref显式指定依赖时,则显式指定的依赖覆盖自动装配依赖;对于大型的应用,不鼓励使用自动装配。

 

  1. Spring的"零配置"支持

 

搜索Bean类

Spring提供如下几个Annotation来标注Spring Bean:

@Component: 标注一个普通的Spring Bean类

@Controller: 标注一个控制器组件类

@Service: 标注一个业务逻辑组件类

@Repository: 标注一个DAO组件类

 

5.使用@Resource配置依赖

@Resource使用@Resource与<property.../>元素的ref属性有相同的效果。@Resource不仅可以修饰setter方法,也可以直接修饰实例变量

 

使@PostConstruct和@PreDestroy定制生命周期行为

@PostConstruct和@PreDestroy用于定制Spring容器中Bean的生命周期行为。它们都用于修饰方法,无须任何属性。前者修饰的方法时Bean的初始化方法;后者修饰的方法时Bean销毁之前的方法。

 

Spring4.0增强的自动装配

@Autowired注解来指定自动装配,@Autowired可以修饰setter方法、普通方法、实例变量和构造器等。

 

二、Spring的AOP

1.AOP基本概念:

AOP(Aspect Orient Programming)专门用于处理系统中分布于各个模块(不同方法)中的交叉关注点的问题,在JavaEE应用中,常常通过AOP来处理一些具有横切性质的系统级服务,如事务管理、安全检查、缓存、对象池管理等,AOP已经成为一种非常常用的解决方案。

 

2.使用AspectJ实现AOP

AspectJ是一个基于Java语言的AOP框架,提供了强大的AOP功能,其他很多AOP框架都借鉴或采纳其中的一些思想。其主要包括两个部分:一个部分定义了如何表达、定义AOP编程中的语法规范,通过这套语法规范,可以方便地用AOP来解决Java语言中存在的交叉关注点的问题;另一个部分是工具部分,包括编译、调试工具等。

 

3.AOP实现可分为两类:

 

静态AOP实现: AOP框架在编译阶段对程序进行修改,即实现对目标类的增强,生成静态的AOP代理类,以AspectJ为代表。

动态AOP实现: AOP框架在运行阶段动态生成AOP代理,以实现对目标对象的增强,以Spring AOP为代表。

一般来说,静态AOP实现具有较好的性能,但需要使用特殊的编译器。动态AOP实现是纯Java实现,因此无须特殊的编译器,但是通常性能略差。

 

3.关于面向切面编程的一些术语:

 

切面(Aspect): 切面用于组织多个Advice,Advice放在切面中定义。

连接点(Joinpoint): 程序执行过程中明确的点,如方法的调用,或者异常的抛出。在Spring AOP中,连接点总是方法的调用。

增强处理(Advice): AOP框架在特定的切入点执行的增强处理。处理有"around"、"before"和"after"等类型

切入点(Pointcut): 可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。

Spring的AOP支持

Spring中的AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。

 

为了在应用中使用@AspectJ支持,Spring需要添加三个库:

 

aspectjweaver.jar

aspectjrt.jar

aopalliance.jar

 

 

并在Spring配置文件中做如下配置:

 

<!--启动@AspectJ支持-->

<aop:aspectj-autoproxy/>

 

<!--指定自动搜索Bean组件、自动搜索切面类-->

<context:component-scan base-package="edu.shu.sprint.service">

    <context:include-filter type="annotation" expression="org.aspectj.lang.annotation.Aspect"/>

</context:component-scan>

 

来源:http://codepub.cn/2015/06/21/Basic-knowledge-summary-of-Spring/

posted @ 2019-03-28 19:34  旺旺a  阅读(790)  评论(0编辑  收藏  举报