昆明java培训
达内昆明广州春城路

18487146383

热门课程

Java培训:CGLIB代理

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

昆明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:检索策略三个知识点

掌握2点流技术成为java高手

java游戏开发编程难吗?——达内java培训

程序猿必学之Java 9——昆明达内

java集合-Iterator迭代

选择城市和中心
贵州省

广西省

海南省