zoukankan      html  css  js  c++  java
  • Spring框架学习第二天

    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>
  • 相关阅读:
    题目一:使用Java实现二维数组中的查找
    算法的时间复杂度
    爬虫----爬虫存储库
    爬虫----爬虫解析库Beautifulsoup模块
    问卷调查
    爬虫----爬虫请求库selenium
    爬虫----爬虫请求库requests
    爬虫----爬虫基本原理
    python金融与量化分析------Matplotlib(绘图和可视化)
    Python与金融量化分析----金融与量化投资
  • 原文地址:https://www.cnblogs.com/FlyBlueSky/p/9185451.html
Copyright © 2011-2022 走看看