Aop 初学者

                        面向 “Aop” (切面)编程

   配置applicationContext.xml

    1.三种注入方式

//创建存储数据的类
    public class happyServlet {

    private String info;

    public happyServlet() {
    }

    public happyServlet(String info) {
        this.info = info;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    public void work(){
    System.out.println("我是Info::"+info);
}

}   


       1.1 set方法注入本质上是调用了Bean的setXXX()方法进行值的注入


     //配置 xml 调用类中参数进行赋值。

     //id: 理解为我们 happyServlet实例对象或者是别名
     //class : 是调用类的路径
 
         <bean id="Day01" class="cn.happy.Day01.happyServlet">

    //name:为我们的创建的属性
    //value:值

         <property name="info" value="大明星"></property>
         </bean>


       1.2 构造注入

       1.给实体类添加构造
       2.通过constructor-arg设置的参数的值
       结论:如果构造注入和set方法注入应用到同一个属性上,那么优先级高的是set方法注入

         <bean id="Day01" class="cn.happy.Day01.happyServlet">
            <constructor-arg index="0" value="ss"></constructor-arg>
            <property name="info" value="我是大明星"></property>
         </bean>

        1.3  p命名空间注入

        1.引入命名空间
        2.不再使用bean的子节点,提炼成属性 p:info , p:info-ref="我是大明星" 提炼构造中的方法


         <bean id="Day01" class="cn.happy.Day01.happyServlet" p:info="我是大明星">        
         </bean>

// 调用我们的测试类测试我们传输的数据
    @Test
    public void ss() {
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        happyServlet srvice = (happyServlet) context.getBean("Day01");
        srvice.work();
      }

     2.集合属性注入


public class MyColleaction {
  public MyColleaction() {
        System.out.println("我是大明星");
    }

    private String[]array;
    private List<String>list;
    private Set<String>set;
    private Map<String,String>map;
    private Properties properties;

    public String[] getArray() {
        return array;
    }

    public void setArray(String[] array) {
        this.array = array;
    }

    public List<String> getList() {
        return list;
    }

    public void setList(List<String> list) {
        this.list = list;
    }

    public Set<String> getSet() {
        return set;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public Map<String, String> getMap() {
        return map;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public Properties getProperties() {
        return properties;
    }

    public void setProperties(Properties properties) {
        this.properties = properties;
    }
}

//xml
<bean id="colleaction" class="cn.happy.Day04.MyColleaction" >
    <!--   scope="prototype"    手动控制不让计算机自己创建对象     autowire="byName" 根据方法对象注入  byType  类型注入只允许有一个 -->
    <property name="array">
       <array>
           <value>刘德华</value>
       </array>
    </property>


    <property name="list">
        <list>
            <value>庞中华</value>
        </list>
    </property>

    <property name="set">
        <set>
            <value>方中华</value>
        </set>
    </property>


    <property name="properties">
        <props>
            <prop key="001">邓紫棋</prop>
        </props>
    </property>

    <property name="map">
        <map>
            <entry key="01">
                <value>邓丽君</value>
            </entry>
        </map>
    </property>

</bean>

3.IOC和DI
  IOC侧重的是思想 ,DI实现
  IOC侧重构造对象:通过容器  DI对属性值进行注入  (普通属性和域属性的注入)


4.AOP:Aspect Oriented Programming 面向切面编程  增强类
  OOP  面向对象编程
  OOD
  OOA
 
5.AOP 
  前置增强  MethodBeforeAdvice
  引入一个节点
  aspectjweaver
     <!-- https://mvnrepository.com/artifact/aspectj/aspectjweaver -->
        <dependency>
            <groupId>aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.5.3</version>
        </dependency>


//案例


//aop
public class MyBeforeAdvice implements  MethodBeforeAdvice {
    //AfterReturningAdvice 后置增强
    public void before(Method method, Object[] objects, Object o) throws Throwable {
        System.out.println("记录日志");
    }
}

//Dao


public interface SomeDao {
    public void ss();
}

//

public class SomeDaoImpl  implements SomeDao{
    public void ss() {
        System.out.println("加油 !  努力 !");
    }
}

//servlet


public interface SomeServlet {
    public  void ss();
}


//实现

public class SomeServletImpl implements SomeServlet{
    SomeDao som=new SomeDaoImpl();

    public SomeDao getSom() {
        return som;
    }

    public void setSom(SomeDao som) {
        this.som = som;
    }

    public void ss() {
       som.ss();

    }
}
//xml

   <bean id="someDao" class="cn.happy.Day03.dao.SomeDaoImpl"></bean>

   <bean id="someServlet" class="cn.happy.Day03.service.SomeServletImpl">
       <property name="som" ref="someDao"></property>
   </bean>

    <bean id="advice" class="cn.happy.Day03.aop.MyBeforeAdvice"></bean>
    <aop:config>
        <aop:pointcut id="MyBeforeAdvice" expression="execution(* *..service.*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="advice" pointcut-ref="MyBeforeAdvice"></aop:advisor>
    </aop:config>

6.AOP概念
  1.面向切面编程 Aspact Oriented Programming
  2.7个专业术语
    增强处理/通知(Advice)
       增强类中的方法
    切入点(Pointcut)
         符合切点表达式的方法才能称为切入点
    连接点(Join Point)
         目标对象中的所有方法都是连接点
    切面(Aspect)
       增强类
    目标对象(Target object)
       等待被增强的对象
    AOP代理(AOP proxy)
        代理对象,内存中创建的。
    织入(Weaving)
      将切面和目标对象进行绑定的过程

原文地址:https://www.cnblogs.com/1612ss/p/7643356.html