Spring aop

Spring AOP的介绍

AOP概念

切面(Aspect):一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。在Spring AOP中,切面可以使用基于模式)或者基于@Aspect注解的方式来实现。 

连接点(Joinpoint):在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。在Spring AOP中,一个连接点总是表示一个方法的执行。

通知(Advice):在切面的某个特定的连接点上执行的动作。其中包括了“around”“before”“after”等不同类型的通知(通知的类型将在后面部分进行讨论)。许多AOP框架(包括Spring)都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。 

切入点(Pointcut):匹配连接点的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。 


目标对象(Target Object): 被一个或者多个切面所通知的对象。也被称做被通知(advised)对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 

AOP代理(AOP Proxy):AOP框架创建的对象,用来实现切面契约(例如通知方法执行等等)。在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 

AOP(Aspect Oriented Programming - 面向方面编程)
        日志
        权限(功能权限,菜单权限,页面权限,角色权限,数据权限,类与方法权限,属性权限)
        安全
        事务(Transaction)
                (1).全局性
                (2).局部性
AOP特征
        各步骤之间良好的隔离性
        原代码无关性
AOP技术实现
        动态代理(面向接口编程)
        CGLib(面向具体类编程)

PO persistent object持久对象
.有时也被称为Data对象,对应数据库中的entity,可以简单认为一个PO对应数据库中的一条记录。
.在hibernate持久化框架中与insert/delet操作密切相关。
PO中不应该包含任何对数据库的操作。

POJO plain ordinary java object 无规则简单java对象
一个中间对象,可以转化为PODTOVO
POJO持久化之后==PO 
(在运行期,由Hibernate中的cglib动态把POJO转换为POPO相对于POJO会增加一些用来管理数据库entity状态的属性和方法。
PO对于programmer来说完全透明,由于是运行期生成PO,所以可以支持增量编译,增量调试。)
POJO传输过程中==DTO
POJO用作表示层==VO
PO VO都应该属于它。


BO business object 业务对象
封装业务逻辑为一个对象(可以包括多个PO,通常需要将BO转化成PO,才能进行数据的持久化,反之,从DB中得到的PO,需要转化成BO才能在业务层使用)。
关于BO主要有三种概念
、只包含业务对象的属性;
、只包含业务方法;
、两者都包含。
在实际使用中,认为哪一种概念正确并不重要,关键是实际应用中适合自己项目的需要。



VO value object值对象 / view object表现层对象
.主要对应页面显示(web页面/swtswing界面)的数据对象。
.可以和表对应,也可以不,这根据业务的需要。
注 :在struts中,用ActionFormVO,需要做一个转换,因为PO是面向对象的,而ActionForm是和view对应的,要将几个PO要显示的属性合成一个ActionForm,可以使用BeanUtilscopy方法。



DTO TO) :Data Transfer Object数据传输对象
.用在需要跨进程或远程传输时,它不应该包含业务逻辑。
.比如一张表有100个字段,那么对应的PO就有100个属性(大多数情况下,DTO 内的数据来自多个表)。但view层只需显示10个字段,没有必要把整个PO对象传递到client,这时我们就可以用只有这10个属性的DTO来传输数据到client,这样也不会暴露server端表结构。到达客户端以后,如果用这个对象来对应界面显示,那此时它的身份就转为VO


Spring AOP的功能和目标


Spring AOP使用纯Java实现。它不需要专门的编译过程。Spring AOP不需要控制类装载器层次,因此它适用于J2EE web容器或应用服务器。 

Spring目前仅支持使用方法调用作为连接点(join point)(在Spring bean上通知方法的执行)。虽然可以在不影响到Spring AOP核心API的情况下加入对成员变量拦截器支持,但Spring并没有实现成员变量拦截器。如果你需要把对成员变量的访问和更新也作为通知的连接点,可以考虑其它的语言,如AspectJ。 

Spring实现AOP的方法跟其他的框架不同。Spring并不是要提供最完整的AOP实现(尽管Spring AOP有这个能力),相反的,它其实侧重于提供一种AOP实现和Spring IoC容器之间的整合,用于帮助解决在企业级开发中的常见问题。 

因此,SpringAOP功能通常都和Spring IoC容器一起使用。切面使用普通的bean定义语法来配置(尽管Spring提供了强大的"自动代理(autoproxying"功能):与其他AOP实现相比这是一个显著的区别。有些事使用Spring AOP是无法轻松或者高效完成的,比如说通知一个细粒度的对象(例如典型的域对象):这种时候,使用AspectJ是最好的选择。不过经验告诉我们,对于大多数在J2EE应用中适合用AOP来解决的问题,Spring AOP都提供了一个非常好的解决方案。 

Spring AOP从来没有打算通过提供一种全面的AOP解决方案来与AspectJ竞争。我们相信无论是基于代理(proxy-based)的框架如Spring AOP或者是成熟的框架如AspectJ都是很有价值的,他们之间应该是互补而不是竞争的关系。Spring 2.0可以无缝的整合Spring AOPIoCAspectJ,使得所有的AOP应用完全融入基于Spring的应用体系。这样的集成不会影响Spring AOP API或者AOP Alliance APISpring AOP保持了向下兼容性

Spring的处理
1、前置通知
实现步骤
1』接口
2』实现类
3』前置通知类MethodBeforeAdvice
4』在beans.xml文件配置:
//定义目标对象类
        <bean id="目标对象id" class="包名.类名目标对象实现类">
        </bean>
//定义befor处理类
        <bean id="befor处理类id" class="包名.类名before处理类"/>
5』定义AOP代理
//定义aop代理
<bean id="person" class="org.springframework.aop.framework.ProxyFactoryBean">
                //接口
                 <property name="proxyInterfaces">
                        <value>包名.类名目标接口</value>
                </property> 
                <property name="target">
                        <ref local="目标对象id引用"/>                
                </property>
//引入定义的处理类
                <property name="interceptorNames">
                        <list>
                                <value>切入点处理类id</value>
                        </list>
                </property>
        </bean>

处理:spring的处理
    处理有五种:
         (1).before advice(前置通知)
            是在方法调用前调用,没有返回值,通常意外情况下,会继续运行下一步方法.记住的一点是没有返回值。
         (2).after advice(后置通知)
             是在方法调用后调用,有返回值,记住的一点是有返回值。
         (3).around advice(环绕通知)
            around是针对具体的某个切入点的方法,around的切入类型是就这个方法的内部调用,是通过java的元数据,
                在运行时通过Method.invoke来调用,具有返回值,当发生意外的时候会终止.记住的一点是有返回值
         (4).throws advice(异常通知)
         (5).introduce advice(引入通知)
           引入通知是一种特殊的通知,它能将新的成员变量、成员方法引入到目标类中。它不能作用于任何切入点,
           因为它只作用于类层次,而不是方法层次。实现引入通知需要实现IntroductionAdvisorIntroductionInterceptor接口。
       引入通知不能调用proceed方法。Advisor必须针对每个实例,并且是有状态的。
       引入通知的效果类似于设计模式中的访问者模式(Visitor Pattern)

spring bean的作用域
   1.singletion(单例)  IOC容器中bean定义一对象实例.
   2.prototype(原型)  每次请求都创建一个新的bean实例.
   3.session
   4.request
   5.global session 全局

spring的四大特点
  1.低侵入设计
  2.独立于各种应用服务器
  3.DI机制 降低了替换业务复杂性
  4.高度开放性并不强制完全依赖spring贯穿表现层,业务层,持久层

pring注入的2种方式
   
   Setter注入和构造器注入 
   
   look up 注入

spring创建实例的方式(如默认的静态工厂 工厂方法)
      1.xml配置使用bean的类构造器
2.xml配置+factory类,使用静态工厂方法实例化
3.xml配置+factory类,使用实例工厂方法实例化

spring初始化回调方法以及销毁析构回调)方法配置
    初始化 实现InitializingBean 调用afterPropertiesSet()
    销毁 实现 DisposableBean 调用destroy()

Spring中如何配置数据源:
<1>        JdbcDaoSupport (2.0版本)
<2>        JdbcTemplate  (2.0版本)
<3>        SimpleJdbcTemplate (2.5版本)

 

 

 

 

 

概念

补充:

 https://www.cnblogs.com/hadoop-dev/p/7095464.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值