aspectj-autoproxyproxy-target-class="true"/>
JDK动态代理和CGLIB字节码生成的区别?
*JDK动态代理只能对实现了接口的类生成代理,而不能针对类
*CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
Autowrire(自动装配)
根据名称自动装配
在Spring的配置文件头中加入default-autowire="byName"
其中bean里面的id一定与你的bean类名字一样,不然找不到并装配不了
根据类型自动装配
在Spring的配置文件头中加入default-autowire="byType",Spring默认装配方式
其中bean里面的id可以与你的bean类名字不一样,可以通过class来查找你需要注入的属性
Injection(依赖注入)
spring的普通属性注入
什么是属性编辑器,作用?
*自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
*如何定义属性编辑器?
*继承PropertyEditorSupport类,覆写setAsText()方法
packagecom.bjsxt.spring;
importjava.beans.PropertyEditorSupport;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
/**
*java.util.Date属性编辑器
*@authorAdministrator
*
*/
publicclassUtilDatePropertyEditorextendsPropertyEditorSupport{
privateStringformat="yyyy-MM-dd";
@Override
publicvoidsetAsText(Stringtext)throwsIllegalArgumentException{
SimpleDateFormatsdf=newSimpleDateFormat(format);
try{
Dated=sdf.parse(text);
this.setValue(d);
}catch(ParseExceptione){
e.printStackTrace();
}
}
publicvoidsetFormat(Stringformat){
this.format=format;
}
}
*将属性编辑器注册到spring中
--定义属性编辑器-->
依赖对象的注入方式,可以采用:
*ref属性
*[标签]
*内部来定义
如何将公共的注入定义描述出来?
*通过标签定义公共的属性,指定abstract=true
*具有相同属性的类在标签中指定其parent属性
-- -->
Proxy(代理)
静态代理
静态代理只需写一个静态代理类就可以了
packagecom.bjsxt.spring;
publicclassUserManagerImplProxyimplementsUserManager{
privateUserManageruserManager;
publicUserManagerImplProxy(UserManageruserManager){
this.userManager=userManager;
}
publicvoidaddUser(Stringusername,Stringpassword){
checkSecurity();
this.userManager.addUser(username,password);
}
publicvoiddeleteUser(intid){
checkSecurity();
this.userManager.deleteUser(id);
}
publicStringfindUserById(intid){
returnnull;
}
publicvoidmodifyUser(intid,Stringusername,Stringpassword){
}
privatevoidcheckSecurity(){
System.out.println("----------checkSecurity()---------------");
}
}
客户端代码
UserManageruserManager=newUserManagerImplProxy(newUserManagerImpl());
userManager.addUser("张三","123");
动态代理
动态代理的话就要写一个Handler,通过Handler来生成管理类的代理
packagecom.bjsxt.spring;
importjava.lang.reflect.InvocationHandler;
importjava.lang.reflect.Method;
importjava.lang.reflect.Proxy;
publicclassSecurityHandlerimplementsInvocationHandler{
privateObjecttargetObject;
publicObjectnewProxy(ObjecttargetObject){
this.targetObject=targetObject;
returnProxy.newProxyInstance(targetObject.getClass().getClassLoader(),
targetObject.getClass().getInterfaces(),
this);
}
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)
throwsThrowable{
checkSecurity();
Objectret=null;
try{
ret=method.invoke(this.targetObject,args);
}catch(Exceptione){
e.printStackTrace();
thrownewjava.lang.RuntimeException(e);
}
returnret;
}
privatevoidcheckSecurity(){
System.out.println("----------checkSecurity()---------------");
}
}
客户端代码
SecurityHandlerhandler=newSecurityHandler();
UserManageruserManager=(UserManager)handler.newProxy(newUserManagerImpl());
userManager.addUser("张三","123");
springBean的作用域
scope可以取值:
*singleton:
每次调用get