码迷,mamicode.com
首页 > 编程语言 > 详细

Spring框架学习第二天

时间:2018-06-14 23:58:58      阅读:303      评论:0      收藏:0      [点我收藏+]

标签:before   pen   this   none   类型   代理   com   bean   cut   

1.使用注解配置Spring

  1.导包基本包4个+2个Spring+aop

  2.导入新的命名空间context

  3.开启注解扫描功能

<!-- 扫描着这包下的注解 -->
    <context:component-scan base-package="cn.xiaou.domain"></context:component-scan>

  4.在bean类的操作

技术分享图片
 1 //将对象注册到容器
 2 @Component("s1")
 3 /*
 4  * @Service("s1")
 5  * @Controller("s1")
 6  * @Repository("s1")
 7  */
 8 /*修改对象的作用范围
 9  * @Scope("prototype") 多例
10  * @Scope("singleton") 单例 默认
11  */
12 @Scope("singleton")
13 public class Student {
14     //值注入,不推荐因为是通过反射Field赋值,破坏来来封装性
15     @Value("zjj")
16     private String name;
17     
18     private Integer age;
19     /*
20      * @Resource(name="class1") 手动装配
21      * @Autowired 
22      * 自动装配根据类型进行装配
23      * 如果出现多个类型一样的对象,将无法控制注入的是那个对象
24      */
25     @Resource(name="class1")
26     private Class clazz;
27     
28     public Class getClazz() {
29         return clazz;
30     }
31     public void setClazz(Class clazz) {
32         this.clazz = clazz;
33     }
34     public String getName() {
35         return name;
36     }
37     public void setName(String name) {
38         this.name = name;
39     }
40     //值注入推荐使用
41     @Value("18")
42     public void setAge(int age) {
43         this.age = age;
44     }
45     @Override
46     public String toString() {
47         return "Student [name=" + name + ", age=" + age + ", clazz=" + clazz + "]";
48     }
49     
50     @PostConstruct
51     public void init() {
52         System.out.println("我是初始方法");
53     }
54     @PreDestroy
55     public void destory() {
56         System.out.println("我是摧毁方法");
57     }
58 }
Annotation

2.aop

  1.aop的名词学习

      joinpoint(连接点):目标对象中,所有可以增强的方法

      pointcut(切入点):目标对象,已经增强的方法

      Advice(通知/增强):增强的代码

      Target(目标对象):被代理对象

      weaving(织入):将通知应用切入点的过程

      Proxy(代理):将通知织入到目标对象之后,形成的代理对象

      aspect(切面):切入点和通知

  2.Spring实现的aop  

     1.动态代理:通过接口代理

     2.cglib代理:不用通过接口,而是通过继承实现代理

     在Spring中是先判断代理类是否可以通过接口代理如果不行则通过cglib代理

  3.Spring动态代理实现

      1.导包(4个基本包+aspects切面包+aop包)第三方的jar包(aopalliance和weaver)

      2.目标类 

public class ProxyDemoImpl implements ProxyDemo{

    @Override
    public void save() {
        System.out.println("保存中");
    }

    @Override
    public void query() {
        System.out.println("查询中");
    }

    @Override
    public void update() {
        System.out.println("更新中");
    }

}

      3.准备通知

public class MyAdvice {
    public void before() {
        System.out.println("前置通知");
    }
    
    public void afterRunning() {
        System.out.println("这是后置通知");
    }
    
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("这是环绕通知前置部分");
        Object proceed = pjp.proceed();
        System.out.println("这是环绕通知后置部分");
        return proceed;
    }
    
    public void afterException() {
        System.out.println("异常");
    }
    
    public void after() {
        System.out.println("这是后置通知");
    }
}

    4.配置进行织入,将通知织入目标对象中

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://www.springframework.org/schema/beans"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
        
    <bean name="ProxyDemo"  class="cn.xiaou.proxy.ProxyDemoImpl"></bean>
    <bean name="myAdvice" class="cn.xiaou.proxy.MyAdvice"></bean>
    <!-- 动态代理配置 -->
    <aop:config>
        <!-- 配置切点 -->
        <aop:pointcut expression="execution(* cn.xiaou.proxy.*DemoImpl.*(..))" id="pc"/>
        <!-- 对切面进行配置 -->
        <aop:aspect ref="myAdvice">
            <!-- 对前置通知方法配置 -->
            <aop:before method="before" pointcut-ref="pc"/>
            <!-- 对后置通知方法配置 如果报错就不执行-->
            <aop:after-returning method="afterRunning" pointcut-ref="pc"/>
            <!-- 这是环绕通知,在前后都会执行 -->
            <aop:around method="around" pointcut-ref="pc"/>
            <!--  这是异常通知 -->
            <aop:after-throwing method="afterException" pointcut-ref="pc"/>
            <!-- 这是前置通知,无论有无异常都会执行 -->
            <aop:after method="after" pointcut-ref="pc"/>
        </aop:aspect>
    </aop:config>
</beans>

 

Spring框架学习第二天

标签:before   pen   this   none   类型   代理   com   bean   cut   

原文地址:https://www.cnblogs.com/FlyBlueSky/p/9185451.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!