课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > Java培训:CGLIB代理
  • Java培训:CGLIB代理

    发布:昆明Java培训      来源:达内新闻      时间:2016-10-21

  • 昆明Java培训班的老师知道,CGLIB(CODE GENERLIZE LIBRARY)代理是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的所有方法,所以该类或方法不能声明称final的。

    如果目标对象没有实现接口,则默认会采用CGLIB代理;

    如果目标对象实现了接口,可以强制使用CGLIB实现代理(添加CGLIB库,并在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)

    test

    public class Test {

    public static void main(String[] args) {

    final UserService service=new UserService();

    //1.创建

    Enhancer enhancer=new Enhancer();

    //2.设置根据哪个类生成子类

    enhancer.setSuperclass(service.getClass());

    //3.指定回调函数

    enhancer.setCallback(new MethodInterceptor() {

    //实现MethodInterceptor接口方法 

    public Object intercept(Object proxy, Method method, Object[] object,

    MethodProxy methodproxy) throws Throwable {

    //System.out.println("代码增强");

    System.out.println("前置代理");

    //通过代理类调用父类中的方法 

    Object invoke = method.invoke(service, object);

    System.out.println("后置代理"); 

    return invoke;

    }

    });

    //通过字节码技术动态创建子类实例 

    UserService proxy = (UserService) enhancer.create();

    proxy.delete();

    }

    }

    Enhancer

    applicationContext.xml

    <bean id="service" class="cn.wgy.day01.service.UserService"></bean>

    <bean id="error" class="cn.wgy.day01.aop.ErrorLog"/>

    <aop:config>

    <aop:pointcut expression="execution(public void delete())" id="pointcut"/>

    <!--异常抛出增强-->

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

    </aop:config>

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

    上面昆明Java培训班的老师讲的都是关于XML文件的,下面的是关于关于注解的,即DI(依赖注入)注解。

    我们先了解注释配置相对于XML配置具有很多的优势

    1.它可以充分利用Java的反射机制获取类结构信息,这些信息可以有效减少配置的工作。如使用JPA注释配置ORM映射时,我们就不需要指定PO的属性名、类型等信息,如果关系表字段和PO属性名、类型都一致,您甚至无需编写任务属性映射信息——因为这些信息都可以通过Java反射机制获取。

    2.注释和Java代码位于一个文件中,而XML配置采用独立的配置文件,大多数配置信息在程序开发完成后都不会调整,如果配置信息和Java代码放在一起,有助于增强程序的内聚性。而采用独立的XML配置文件,程序员在编写一个功能时,往往需要在程序文件和配置文件中不停切换,这种思维上的不连贯会降低开发效率。

    因此在很多情况下,注释配置比XML配置更受欢迎,注释配置有进一步流行的趋势。spring 2.5的一大增强就是引入了很多注释类,现在您已经可以使用注释配置完成大部分XML配置的功能。在下面的内容中,昆明Java培训班的老师将向您讲述使用注释进行Bean定义和依赖注入的内容。

    使用注解来构造IoC容器

    用注解来向Spring容器注册Bean。需要在applicationContext.xml中注册

    <!--包扫描器 -->  

    <!-- component-scan标签默认情况下自动扫描指定路径下的包(含所有子包)-->

    <context:component-scan base-package="cn.happy.day01.entity">

    </context:component-scan>

    表明cn.gacl.java包及其子包中,如果某个类的头上带有特定的注解【@Component/@Repository/@Service/@Controller】,就会将这个对象作为Bean注册进Spring容器。也可以在<context:component-scan base-package=””/>中指定多个包,如:

    <context:component-scan base-package="cn.happy.day01.dao.impl.service.impl,cn.happy.day01.action"/>

    下面是详解重要的几个注解

    多个包逗号隔开。

    1、@Component

    @Component

    是所有受Spring管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。

    2、@Controller

    @Controller对应表现层的Bean,也就是Action,例如:

    @SuppressWarnings("serial")

    @Controller("employeeAction") //默认就是employeeAction,可以不写

    @Scope("prototype")//设置多例

    public class EmployeeAction extends BaseAction<Employee> {

    }

    使用@Controller注解标识EmployeeAction之后,就表示要把EmployeeAction交给Spring容器管理,在Spring容器中会存在一个名字为"employeeAction"的action,这个名字是根据EmployeeAction类名来取的。注意:如果@Controller不指定其value(@Controller),则默认的bean名字为这个类的类名首字母小写,如果指定value(@Controller(value="EmployeeAction"))或者(@Controller("EmployeeAction")),则使用value作为bean的名字。

    这里的EmployeeAction还使用了@Scope注解,@Scope("prototype")表示将Action的范围声明为原型,可以利用容器的scope="prototype"来保证每一个请求有一个单独的Action来处理,避免struts中Action的线程安全问题。spring默认scope是单例模式(scope="singleton"),这样只会创建一个Action对象,每次访问都是同一Action对象,数据不安全,struts2是要求每次次访问都对应不同的Action,scope="prototype"可以保证当有请求的时候都创建一个Action对象

    3、@ Service

    @Service对应的是业务层Bean,例如:

    /**

    *如果用注解配置事务增强     即在类的上面写 @Transactional即可

    * @author Admin

    *

    */

    @Service //service层

    public class EmplolyeeServiceImpl extends BaseDaoImpl<Employee> implements IEmployeeService {

    //注意:根本就没有走dao,直接到dasedaoimpl里面找方法,不用注入dao

    }

    @Service("employeeService")注解是告诉Spring,当Spring要创建EmployeeServiceImpl的的实例时,bean的名字必须叫做"employeeService",这样当Action需要使用EmployeeServiceImpl的的实例时,就可以由Spring创建好的"employeeService",然后注入给Action:在Action只需要声明一个名字叫“employeeService”的变量来接收由Spring注入的"employeeService"即可,具体代码如下:

    //员工Service

    @Resource

    protected IEmployeeService service;

    //岗位Service

    @Resource

    protected IPositionService positionservice;

    //部门Service

    @Resource

    protected IDepartmentService deparmentService;

    4、@ Repository

    @Repository对应数据访问层Bean,例如:

    //让一个普通类被spring管理

    @Repository //dao层

    public class EmployeeDAOImpl extends BaseDaoImpl<Employee> implements IEmployeeDAO {

    //要知道bean的id是什么呢?

    //解答:就是该类的类名,而且首字母是小写  即id="employeeDAOImpl"

    }

    @Repository注解是告诉Spring,让Spring创建一个名字叫“employeeDAOImpl”的EmployeeDaoImpl实例。

    当Service需要使用Spring创建的名字叫“employeeDAOImpl”的EmployeeDaoImpl实例时,就可以使用@Resource注解告诉Spring,Spring把创建好的employeeDAOImpl注入给Service即可。

    5.@Required

    @Required

    public void setSysDepartment(Department sysDepartment) {

    this.sysDepartment = sysDepartment;

    }

    @ required负责检查一个bean在初始化时其声明的set方法是否被执行,当某个被标注了@Required的Setter方法没有被调用,则Spring在解析的时候会抛出异常,以提醒开发者对相应属性进行设置。@Required注解只能标注在Setter方法之上。因为依赖注入的本质是检查Setter方法是否被调用了,而不是真的去检查属性是否赋值了以及赋了什么样的值。如果将该注解标注在非setXxxx()类型的方法则被忽略。

    推荐文章

上一篇:Java培训班:JDK动态代理

下一篇:Hibernate:检索策略三个知识点

最新开班日期  |  更多

Java--零基础全日制班

Java--零基础全日制班

开班日期:12/29

Java--零基础业余班

Java--零基础业余班

开班日期:12/29

Java--周末提升班

Java--周末提升班

开班日期:12/29

Java--零基础周末班

Java--零基础周末班

开班日期:12/29

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56