• 对于Spring的DI和AOP的简单理解


    一.DI(依赖注入,这里没有涉及到注释.只是用xml文件和Bean的方法来注册pojo,)

       依赖注入就是将创建bean对象的权利交给spring框架(控制反转) 然后用Applicationcontext.getBean()  来获取对象.

       容器:spring容器创建对象,管理对象,并负责管理对象的生命周期.  容器有两种 BeanFactiory   ..ApplicationContext ..多的就不解释了,BeanFactiory 比较low,这里使用ApplicaitonContext

       ApplicaitonContext:

             1  FileSystemXmlApplicationContext:以基于文件系统的XML配置文件创建ApplicationContext实例。

             2  ClassPathXmlApplicationContext:以类加载路径下的XML配置文件创建的ApplicationContext实例

             3    XmlWebApplicationContext:从web应用下的一个或者多个xml配置文件加载创建ApplicationContext实例

             4   AnnotationConfigApplicationContext 从一个或者多个基于java的配置类中加载Spring ApplicaitonContext实例

             5    AnnotationConfigWebApplicationContext 基于一个或者多个java的配置类来创建spring web 的应用上下文

     二. Aop :面向切面编程.(将复用性很强的模块抽离出来,然后通过配置,将抽离出来的模块(比如日志模块),覆盖到其他需要日志模块的服务上)

           一个项目假设有讲师服务,学生服务,计费服务.......还有日志模块,安全模块,事务模块

           讲师服务,学生服务,计费服务 每一个服务都需要与日志模块,安全模块,事务模块 进行耦合.....如果这个样子,,每一个服务里面的代码不能够专注于解决本服务的问题.需要调用日志模块,安全模块,事务模块的代码.

           这样,代码的复用性会很低,耦合性很高.

     创建一个Person类...里面有一个doSomething方法

    复制代码
    package com.start.demo;
    /**
     * 男孩,女孩,工程师,程序员....
     */
    public class Person {
        private String name;
        private int age;
        private Play play;
    
        public Person(Play p) {
            this.play = p;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public int getAge() {
            return age;
        }
    
        public void setAge(int age) {
            this.age = age;
        }
    
        void doSomething() {
            System.out.println(" we can  play " + play.getType() +"together");
        }
    }
    复制代码

       创建一个Play类  type 表示可以做的事情

    复制代码
    package com.start.demo;
    
    /**
     * 各种活动,,玩游戏,读书,看电视.....
     */
    public class Play {
        private String type="computer game";
    
        public String getType() {
            return type;
        }
    
        public void setType(String type) {
            this.type = type;
        }
    }
    复制代码

        测试Aop的一个类

    复制代码
    package com.start.demo;
    
    /**
     * 这个类是用来测试Aop.在切点之前,之后,分别调用对应的方法
     */
    public class Asker {
        private String name;
         void doSomethingBefore(){
            System.out.println("what can we do ");
        }
        void  doSomethingAfter(){
            System.out.println("that's fine");
        }
    }
    复制代码

    装配bean的xml

    复制代码
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           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.xsd">
         <!--装配bean-->
        <bean id="person" class="com.start.demo.Person">
            <constructor-arg ref="play"/>
        </bean>
        <bean id="play" class="com.start.demo.Play"/>
        <bean id="asker" class="com.start.demo.Asker"/>
        <aop:config>
            <aop:aspect ref="asker">
                <!-- pointcut 的id 不能与 配置切点bean的id一样了,会报错.-->
                <aop:pointcut id="personPointcut"
                              expression="execution(* *.doSomething())"/><!--execution(* * .doSomething(..)) 要是有参数,需要在方法体里面加 ..-->
                <aop:before pointcut-ref="personPointcut" method="doSomethingBefore"/>
                <aop:after pointcut-ref="personPointcut" method="doSomethingAfter"/>
            </aop:aspect>
        </aop:config>
    
    </beans>
    复制代码

      用javaBean来装配对象

    复制代码
    package com.start.confBean;
    
    import com.start.demo.Person;
    import com.start.demo.Play;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class PersonConf {
        @Bean
        public Person person() {
            return new Person(play());
        }
    
        @Bean
        public Play play() {
            return new Play();
        }
    }
    复制代码

    测试Main类

       

    复制代码
    package com.start.demo;
    
    import com.start.confBean.PersonConf;
    import org.springframework.context.annotation.AnnotationConfigApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class TestMain {
        public static void main(String[] args) {
            ClassPathXmlApplicationContext appcontext = new ClassPathXmlApplicationContext("beans.xml");    //从beans.xml 文件获取ApplicaitonContext 
    //        AnnotationConfigApplicationContext annotationApplicationContext = new AnnotationConfigApplicationContext(PersonConf.class);//PersonConf.java 文件获取ApplicaitonContext 
    //        Person person1 = annotationApplicationContext.getBean(Person.class);  //获取bean ,直接指定Bean 为Person
    //        Person person = (Person) appcontext.getBean("person");//获取bean   person 为配置文件里面的 id
            Person pers = (Person) appcontext.getBean("person");
            pers.doSomething();
        }
    }
  • 相关阅读:
    使用原始XML资源——使用原始XML文件
    使用原始XML资源——定义原始XML资源
    属性动画(Property Animation)资源
    使用(Drawable)资源———AnimationDrawable资源
    使用(Drawable)资源———ClipDrawable资源
    RabbitMQ基本理论
    Celery分布式任务队列快速入门
    python多版本管理包pyenv
    CentOS6最佳实践
    BASH 基本语法
  • 原文地址:https://www.cnblogs.com/ysd139856/p/12722910.html
Copyright © 2020-2023  润新知