面向切面编程(Aspect oriented Programming, AOP)是软件编程思想发展到一定阶段的产物,是对面向编程的有益补充。 AOP一般适用于具有横切逻辑的场合,如访问控制,事物管理,性能检测等。

AOP的目的是从系统中分离出切面,独立于业务逻辑实现,在程序执行时织入程序中运行。

Spring体系结构四个核心组件

  beans:Bean是包装我们应用程序自定义对象Object的,Object中存有数据


  core :Context在发现、建立、维护Bean之间关系所需要的一些工具,如资源的加载,资源的抽象等。 


  context Context就是一个Bean关系的集合


  expression 

AOP(Aspact Oriented Programming)面向切面编程
切面:横切关注点被模块化为特殊的类,这些类成为切面。
优点:每个关注点现在都集中于一处,而不是分散到多处代码中服务模块更简洁,服务模块只需关注核心代码。
AOP的原理:(1)采用代理机制组装起来运行,在不改变原程序的基础上对代码段进行增强处理,增强新的功能
           (2)将复杂的需求分解出不同方面,将分散在系统中的公共功能中集中解决。
连接点:  定义:连接点是一个应用执行过程中能够插入一个切面的点。
          连接点可以是调用方法时,甚至修改字段时,切面代码都可以利用这些点插入到应用的正规流程中。程序执行过程中能够应用通知的所有点。
通知:增强类中的方法就是通知。
切面(Aspect):一个模块化的横切逻辑(或横切关注点)可能会横切多个对象。
连接点:程序执行中的某个具体的执行点。
增强处理:切面在某个特定连接点上执行的代码逻辑。
切入点:对连接点的特征进行描述,可以使用正则表达式。增强处理和一个切入点表达式相关联,并在这个切入点匹配的某个链接点上运行。
目标对象:被一个或多个切面增强的对象。
AOP代代理:有Aop框架所创建的对象,实现执行增强处理方法等功能。
织入:将增强处理连接到应用程序中的类型或对象上的过程。


AOP实现日志记录,在添加用户模块之前和之后,加入自己的代码。
  

前置增强接口 MethodBeforeAdvice 
   
   后置增强接口 AfterReturningAdvice 


 先建一个实体类的包定义一个Student类,写上属性并将其进行分封装:
  private  int  id;
     private  String name;
     private  String age;
     private String email;


 建一个dao的包,在该包中建立一个StudentDao的接口,并写上一个实现的方法:
 public interface StudentDao {
     public  void  stu(Student  student);
 }


 建一个daoinpl包,在包中建一个LoggerAfter类并继承MethodBeforeAdvice接口
 public class LoggBefore implements MethodBeforeAdvice {
     public void before(Method method, Object[] objects, Object o) throws Throwable {
         System.out.println("-----------前置接口噢--------------");
     }
 }


  建立LoggerAfter类并继承AfterReturningAdvice接口
 public class LoggerAfter implements AfterReturningAdvice {
     public void afterReturning(Object o, Method method, Object[] objects, Object o1) throws Throwable {
         System.out.println("---------------后置接口噢-----------------");
     }
 }


 建立StuDaoImpl类继承StudentDao接口
 public class StuDaoImpl implements StudentDao {
     public void stu(Student student) {
         System.out.println("人生若是无误,铅笔何须橡皮!!!");
     }
 }


 创建service成,在该在层中创建StudentBiz接口
 public interface StudentBiz {
     public  void  save(Student  stu);
 }


 创建service层中创建StuBiz类并继承StudentBiz接口
 public class StuBiz implements StudentBiz {
     private StuDaoImpl  stuimpl;
     public void save(Student stu) {
         stuimpl.stu(stu);
     }


     public StuDaoImpl getStuimpl() {
         return stuimpl;
     }


     public void setStuimpl(StuDaoImpl stuimpl) {
         this.stuimpl = stuimpl;
     }
 }


 创建applicationContest.xml
 <?xml version="1.0" encoding="UTF-8"?>
 <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        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
 ">


     <!--dao-->
   <bean id="studaoimpl" class="cn.happy.spring_aop.daoimpl.StuDaoImpl" ></bean>


     <!--service-->
     <bean id="servicestu" class="cn.happy.spring_aop.service.StuBiz">
         <property name="stuimpl" ref="studaoimpl"></property>
     </bean>
     <!--前置-->
     <bean id="loggbefore" class="cn.happy.spring_aop.daoimpl.LoggBefore"></bean>
     <!--后置-->
     <bean id="loggerafter" class="cn.happy.spring_aop.daoimpl.LoggerAfter"></bean>
    <!--AOP-->
 <aop:config>
     <!--切点-->
    <aop:pointcut id="pution" expression="execution(* * ..service.*.*(..))"></aop:pointcut>
     <!--advisor-->
     <aop:advisor advice-ref="loggbefore" pointcut-ref="pution"></aop:advisor>
     <aop:advisor advice-ref="loggerafter" pointcut-ref="pution"></aop:advisor>
 </aop:config>


 </beans>


 创建测试类
 public class SpringAopTest {
 @Test
     public  void  AopTest(){
         ApplicationContext  ctx=new ClassPathXmlApplicationContext("spplicationSpringAop.xml");
         StudentBiz   studentBiz= (StudentBiz) ctx.getBean("servicestu");
         Student  st=new Student();
         st.setName("12");
         studentBiz.save(st);
     }
 }





spring容器创建的时候,会将所有在配置文件中配置的bean对象创建出来,默认bean都是单例的、
  什么是单例??
  一个类在内存中只有一个对象
  *bean成为多例?
bean的作用域
    Struts2:  Action类多例的。 Struts1 Action是单例的
       S2:  Servlet 单例的  xxx_jsp.java  底层也是通过单例多线程来处理客户端请求的
            JSP:单例的 xxx.jsp
    scope="prototype" 原型模式(N个对象):真正使用时才会创建,每获取一次,都会创建不同对象
    scope="singleton" 单例模式:容器初始化时需要使用name建,每次获取的都是同一个对象,默认值

单例:单例模式是一中常用的软件设计模式,在它的核心结构中只包含一个称为单例的特殊类,通过单例模式可以保证系统中一个类只有一个实例,即一个类只有一个对象实例。

程序员可以手动控制bean的创建时机

   Prototype:多例  形成时机是getBean()

   Stringleton:单例  容器构建完毕

  JSP和servlet都是单例的多线程