spring aop的cglib代理

<?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:context="http://www.springframework.org/schema/context"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans-3.0.xsd

http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-3.0.xsd

http://www.springframework.org/schema/aop

http://www.springframework.org/schema/aop/spring-aop-2.5.xsd

http://www.springframework.org/schema/tx

http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"><!-- 开启事务的注解必须加上 xmlns:tx="http://www.springframework.org/schema/tx"  -->

<!-- 开启注解处理器 -->

<context:annotation-config />

<context:component-scan base-package="com.niit">

</context:component-scan>

<aop:aspectj-autoproxy proxy-target-class="false"></aop:aspectj-autoproxy>

<!--<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" />

<property name="url" value="jdbc:oracle:thin:@192.168.1.2:1521:yldev" />

<property name="username" value="ylnews" />

<property name="password" value="ylnews" />

</bean>-->

<!-- JDBC参数配置 -->

<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" >

<property name="locations">

<list>

<value>classpath:/jdbc.properties</value>

</list>

</property>

</bean>

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">

<property name="driverClassName" value="${jdbc.driver}" />

<property name="url" value="${jdbc.url}" />

<property name="username" value="${jdbc.username}" />

<property name="password" value="${jdbc.password}" />

</bean>

<!--<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 如果要用hibernate注解 class改为org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

<property name="dataSource" ref="dataSource" />

<property name="mappingResources" >

<list>

<value>product.hbm.xml</value>

</list>

</property>

<property name="hibernateProperties">

<value>

hibernate.dialect=${hibernate.dialect}

hibernate.show_sql=${hibernate.show_sql}

hibernate.format_sql=${hibernate.format_sql}

hibernate.cache.use_second_level_cache=false

hibernate.cache.provider_class=org.hibernate.cache.OSCacheProvider

hibernate.cache.use_query_cache=false

hibernate.jdbc.fetch_size=50

hibernate.jdbc.batch_size=30

</value>

</property>

</bean> -->

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><!-- 如果要用hibernate注解 class改为org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean -->

<property name="dataSource" ref="dataSource" />

<!--<property name="annotatedClasses">   指定注解方式的实体类

<list>

<value>com.niit.entity.Accessory</value>

</list>

</property> -->

<property name="packagesToScan">   <!-- 扫描注解方式的实体类 -->

<list>

<value>com.niit.entity</value>

</list>

</property>

<!--   <property name="mappingResources" >

<list>

<value>product.hbm.xml</value>

</list>

</property>   -->

<property name="hibernateProperties">

<!--<props>    另一种写法

<prop key="hibernate.dialect">

org.hibernate.dialect.OracleDialect

</prop>

<prop key="hibernate.show_sql">

true

</prop>

</props> -->

<value>

<!-- 设置数据库方言 -->

hibernate.dialect=${hibernate.dialect}

<!-- 输出SQL语句到控制台 -->

hibernate.show_sql=${hibernate.show_sql}

<!-- 格式化输出到控制台的SQL语句 -->

hibernate.format_sql=${hibernate.format_sql}

<!-- 是否开启二级缓存 -->

hibernate.cache.use_second_level_cache=false

<!-- 配置二级缓存产品 -->

hibernate.cache.provider_class=org.hibernate.cache.OSCacheProvider

<!-- 是否开启查询缓存 -->

hibernate.cache.use_query_cache=false

<!-- 数据库批量查询数 -->

hibernate.jdbc.fetch_size=50

<!-- 数据库批量更新数 -->

hibernate.jdbc.batch_size=30

<!--hibernate.current_session_context_class=thread--><!-- 配置事务后就不需要这行,否则需要这行 -->

</value>

</property>

</bean>

<!-- 配置事务管理器 就是指定义一个切面类-->

<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">

<property name="sessionFactory" ref="sessionFactory" /><!-- 注入sessionFactory 通过数据库的连接来管理事务并且还需要知道hibernate的一些配置 -->

</bean>

<!-- 使用注解方式定义事务 有了这行@Transactional才能起作用-->

<tx:annotation-driven transaction-manager="txManager"/>

<!-- 配置事务传播特性 -->

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<tx:method name="save*" propagation="REQUIRED" /><!-- 默认就是REQUIRED -->

<tx:method name="delete*" propagation="REQUIRED" />

<tx:method name="update*" propagation="REQUIRED" />

<tx:method name="get*" read-only="true" />

<tx:method name="load*" read-only="true" />

<tx:method name="find*" read-only="true" />

<tx:method name="*" read-only="true" /><!-- 指上面之外的方法用这个 -->

</tx:attributes>

</tx:advice>

<!-- 配置哪些类的哪些方法参与事务 -->

<aop:config>

<aop:pointcut id="business" expression="execution(* com.niit.datasource..*.*(..))"/><!-- 匹配com.niit.datasource包及其子包所有类的所有方法 -->

<aop:advisor pointcut-ref="business" advice-ref="txAdvice" />

</aop:config>

<bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

<bean id="hibernateDaoSupportDAO" class="com.niit.datasource.HibernateDaoSupportDAO">

<property name="sessionFactory" ref="sessionFactory"></property>

</bean>

</beans>

com.niit.entity.Accessory:

package com.niit.entity;

import javax.persistence.Entity;

import javax.persistence.GeneratedValue;

import javax.persistence.Id;

@Entity

public class Accessory {

private String aid;

private String uploadfilename;

private String uploadcontenttype;

private String uploadrealname;

private String news;

@Id

@GeneratedValue

public String getAid() {

return aid;

}

public void setAid(String aid) {

this.aid = aid;

}

public String getUploadfilename() {

return uploadfilename;

}

public void setUploadfilename(String uploadfilename) {

this.uploadfilename = uploadfilename;

}

public String getUploadcontenttype() {

return uploadcontenttype;

}

public void setUploadcontenttype(String uploadcontenttype) {

this.uploadcontenttype = uploadcontenttype;

}

public String getUploadrealname() {

return uploadrealname;

}

public void setUploadrealname(String uploadrealname) {

this.uploadrealname = uploadrealname;

}

public String getNews() {

return news;

}

public void setNews(String news) {

this.news = news;

}

}

com.niit.datasource.HibernateDaoSupportDAO2:

package com.niit.datasource;

import javax.annotation.Resource;

import org.hibernate.SessionFactory;

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import org.springframework.stereotype.Component;

import com.niit.entity.Accessory;

@Component

public class HibernateDaoSupportDAO2 extends HibernateDaoSupport {

@Resource(name="sessionFactory")

public void setSuperSessionFactory(SessionFactory sessionFactory){

super.setSessionFactory(sessionFactory);

}

public void save2(){

Accessory accessory = new Accessory();

accessory.setNews("2");

accessory.setUploadcontenttype("2");

accessory.setUploadfilename("3");

accessory.setUploadrealname("2");

this.getHibernateTemplate().save(accessory);

}

}

com.niit.SpringDemo:

package com.niit;

import java.util.Iterator;

import java.util.List;

import java.util.Map;

import java.util.Set;

import org.junit.Test;

import org.springframework.aop.support.AopUtils;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.niit.datasource.Dao;

import com.niit.datasource.HibernateDaoSupportDAO;

import com.niit.datasource.HibernateDaoSupportDAO2;

import com.niit.datasource.HibernateDaoSupportInterface;

import com.niit.service.HelloDao;

import com.niit.service.HelloService;

import com.niit.service.MyService;

public class SpringDemo {

/**

* @param args

*/

@Test

public static void main(String[] args) {

ClassPathXmlApplicationContext cpxac = new ClassPathXmlApplicationContext("DataSource.xml");

HibernateDaoSupportDAO2 hibernateDaoSupportDAO2 = (HibernateDaoSupportDAO2)cpxac.getBean("hibernateDaoSupportDAO2");//这里用的是cglib代理不需要接口

hibernateDaoSupportDAO2.save2();

System.out.println(AopUtils.isCglibProxy(hibernateDaoSupportDAO2));

System.out.println(AopUtils.isJdkDynamicProxy(hibernateDaoSupportDAO2));

}

}

时间: 2024-08-02 17:46:46

spring aop的cglib代理的相关文章

深入理解Spring AOP之二代理对象生成

深入理解Spring AOP之二代理对象生成 spring代理对象 上一篇博客中讲到了Spring的一些基本概念和初步讲了实现方法,当中提到了动态代理技术,包含JDK动态代理技术和Cglib动态代理 动态代理这部分我有过一篇博客介绍:动态代理,想深入了解的朋友能够看一看,再回想一下,Spring中怎样区分採用JDK动态代理和CGlib动态代理: 假设目标对象的实现类实现了接口.Spring AOP 将会採用 JDK 动态代理来生成 AOP 代理类: 假设目标对象的实现类没有实现接口,Spring

Spring强制使用CGLIB代理事务

Spring强制使用CGLIB代理事务 springaopjdkreferenceclasspath Spring1.2: 将事务代理工厂[TransactionProxyFactoryBean] 或 自动代理拦截器[BeanNameAutoProxyCreator] 的 proxyTargetClass 属性,设置为true,则使用CGLIB代理,此属性默认为false,使用JDK动态代理. 以下引用 Spring Framework reference 2.0.5: Spring2.0: S

用spring aop实现动态代理的例子

下面由我来给大家展示用spring aop实现动态代理的例子(电脑打印) 下面就看一下具体的代码: 先定义一个打印机的接口 1 package aop007_ComPrint; 2 3 public interface Print { 4 5 public void ColorPrint(); //彩色打印 6 public void WhitePrint(); //黑白打印 7 } 然后定义两个实现类,分别实现彩色打印和黑白打印 1 package aop007_ComPrint; 2 3 p

Spring AOP --JDK动态代理方式

我们知道Spring是通过JDK或者CGLib实现动态代理的,今天我们讨论一下JDK实现动态代理的原理. 一.简述 Spring在解析Bean的定义之后会将Bean的定义生成一个BeanDefinition对象并且由BeanDefinitionHolder对象持有.在这个过程中,如果Bean需要被通知切入,BeanDefinition会被重新转换成一个proxyDefinition(其实也是一个BeanDefinition对象,只不过描述的是一个ProxyFactoryBean).ProxyFa

Spring AOP JDK动态代理与CGLib动态代理区别

静态代理与动态代理 静态代理 代理模式 (1)代理模式是常用设计模式的一种,我们在软件设计时常用的代理一般是指静态代理,也就是在代码中显式指定的代理. (2)静态代理由 业务实现类.业务代理类 两部分组成.业务实现类 负责实现主要的业务方法,业务代理类负责对调用的业务方法作拦截.过滤.预处理,主要是在方法中首先进行预处理动作,然后调用业务实现类的方法 例子 /** * 定义一个账户接口 * @author Administrator */ public interface Count { //

Spring——AOP(动态代理)

以例子说明: 一.创建两个接口,并创建各自的实现类,实现类在XML文件中进行配置,并在测试类中取得各实现类的实例 二.创建代理类,实现InvocationHandler接口 (1)声明实际代理的对象 1 private Object obj;  (2)创建绑定的方法,通过传入的实际代理对象创建对应的代理对象 1 /** 2 * @param obj 3 * @return 代理对象 4 */ 5 public Object bind(Object obj) 6 { 7 this.obj = ob

Spring AOP之 动态代理实例

1.项目结构图如下3.3.3.1: 图3.3.3.1 2.IUserServ接口代码与UserServImpl实现类代码和上述代码相同 3.LogHandler类代码 public class LogHandler implements InvocationHandler { //目标对象 private Object targetObject; /** * 创建动态代理类 * @return object(代理类) */ public Object createProxy(Object tar

Spring AOP 前奏--动态代理

[Java]Spring AOP基础知识-动态代理

Spring AOP使用动态代理技术在运行期织入增强的代码,为了揭示Spring AOP底层的工作机理,有必要对涉及到的Java知识进行学习.Spring AOP使用了两种代理机制:一种是基于JDK的动态代理:另一种是基于CGLib的动态代理.之所以需要两种代理机制,很大程度上是因为JDK本身只提供接口的代理,而不支持类的代理. 带有横切逻辑的实例 我们通过具体化代码实现上一节所介绍例子的性能监视横切逻辑,并通过动态代理技术对此进行改造.在调用每一个目标类方法时启动方法的性能监视,在目标类方法调