尚学堂Spring笔记Word文件下载.docx
- 文档编号:20764766
- 上传时间:2023-01-25
- 格式:DOCX
- 页数:22
- 大小:24.06KB
尚学堂Spring笔记Word文件下载.docx
《尚学堂Spring笔记Word文件下载.docx》由会员分享,可在线阅读,更多相关《尚学堂Spring笔记Word文件下载.docx(22页珍藏版)》请在冰豆网上搜索。
在前一段时间内学习了一些Spring的知识,感觉还是需要整理一下自己的东西,不然我感觉很是容易遗忘。
二、环境
本次学习用到了一些软硬件环境如下:
1.
MyEclipseEnterpriseWorkbench7.0Milestone-1(MyEclipse7.0M1)
2.
Spring2.5
3.
Struts1.2
4.
Hibernate3.2
5.
其他(SVN等)
三、环境搭建
1、spring依赖库
*SPRING_HOME/dist/spring.jar
*SPRING_HOME/lib/jakarta-commons/commons-logging.jar
*SPRING_HOME/lib/log4j/log4j-1.2.14.jar
2、拷贝spring配置文件(applicationContext.xml)到src下
3、拷贝log4j配置文件(log4j.properties)到src下
提示:
上面的一些jar包如果在现在的MyEclipse环境里可以通过添加对Spring的支持自动添加,上面的一些配置文件都可以再Spring官方下载的Spring包中的例子程序中找到相应的一些文件,修改后就可以使用
四、关键技术
Ioc控制反转
springIoc容器的关键点:
*必须将被管理的对象定义到spring配置文件中
*必须定义构造函数或setter方法,让spring将对象注入过来
<
beanid="
唯一标识"
class="
Ioc容器管理的需要注入的类"
>
<
!
--构造方法注入-->
constructor-arg…/>
--set方法-->
propertyname="
set方法的属性"
…/>
/bean>
后面通过读取配置文件,并新建工厂,通过工厂来获得bean
BeanFactoryfactory=newClassPathXmlApplicationContext("
applicationContext.xml"
);
UserManageruserManager=(UserManager)factory.getBean("
XX"
AOP(面向切面编程)
spring对AOP的支持(采用Annotation的方式)
*SPRING_HOME/lib/aspectj/*.jar
2、采用Aspect定义切面
2、在Aspect定义Pointcut和Advice
4、启用AspectJ对Annotation的支持并且将Aspect类和目标对象配置到Ioc容器中
注意:
在这种方法定义中,切入点的方法是不被执行的,它存在的目的仅仅是为了重用切入点
即Advice中通过方法名引用这个切人点
AOP一些关键技术:
*Crosscuttingconcern
*Aspect
*Advice
*Pointcut
*Joinpoint
*Weave
*TargetObject
*Proxy
*Introduction
注意使用AOP的时候一定要添加相应的类库(jar包)
建一个Annotations的类,然后通过添加Spring对AOP的支持,也就是在Spring的配置文件中加入
aop:
aspectj-autoproxy/>
就可以了
代码如下
packagecom.bjsxt.spring;
importorg.aspectj.lang.annotation.Aspect;
importorg.aspectj.lang.annotation.Before;
importorg.aspectj.lang.annotation.Pointcut;
/**
*定义Aspect
*@authorAdministrator
*
*/
@Aspect
publicclassSecurityHandler{
/**
*定义Pointcut,Pointcut的名称就是allAddMethod,此方法不能有返回值和参数,该方法只是一个
*标识
*
*Pointcut的内容是一个表达式,描述那些对象的那些方法(订阅Joinpoint)
@Pointcut("
execution(*add*(..))||execution(*del*(..))"
)
privatevoidallAddMethod(){};
*定义Advice,标识在那个切入点何处织入此方法
@Before("
allAddMethod()"
privatevoidcheckSecurity(){
System.out.println("
----------checkSecurity()---------------"
}
}
客户端代码不变
spring对AOP的支持(采用配置文件的方式)
2、配置如下
config>
aspectid="
security"
ref="
securityHandler"
pointcutid="
allAddMethod"
expression="
execution(*com.bjsxt.spring.UserManagerImpl.add*(..))"
/>
beforemethod="
checkSecurity"
pointcut-ref="
/aop:
aspect>
spring对AOP的支持(关于接口)
spring对AOP的支持
Aspect默认情况下不用实现接口,但对于目标对象(UserManagerImpl.java),在默认情况下必须实现接口
如果没有实现接口必须引入CGLIB库
我们可以通过Advice中添加一个JoinPoint参数,这个值会由spring自动传入,从JoinPoint中可以取得
参数值、方法名等等
代码
importorg.aspectj.lang.JoinPoint;
privatevoidcheckSecurity(JoinPointjoinPoint){
Object[]args=joinPoint.getArgs();
for(inti=0;
i<
args.length;
i++){
System.out.println(args[i]);
System.out.println(joinPoint.getSignature().getName());
spring对AOP的支持(关于接口)二
1、如果目标对象实现了接口,默认情况下会采用JDK的动态代理实现AOP
2、如果目标对象实现了接口,可以强制使用CGLIB实现AOP
3、如果目标对象没有实现了接口,必须采用CGLIB库,spring会自动在JDK动态代理和CGLIB之间转换
如何强制使用CGLIB实现AOP?
*添加CGLIB库,SPRING_HOME/cglib/*.jar
*在spring配置文件中加入<
aspectj-autoproxyproxy-target-class="
true"
JDK动态代理和CGLIB字节码生成的区别?
*JDK动态代理只能对实现了接口的类生成代理,而不能针对类
*CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法
因为是继承,所以该类或方法最好不要声明成final
Autowrire(自动装配)
根据名称自动装配
在Spring的配置文件头中加入default-autowire="
byName"
其中bean里面的id一定与你的bean类名字一样,不然找不到并装配不了
根据类型自动装配
byType"
,Spring默认装配方式
其中bean里面的id可以与你的bean类名字不一样,可以通过class来查找你需要注入的属性
Injection(依赖注入)
spring的普通属性注入
什么是属性编辑器,作用?
*自定义属性编辑器,spring配置文件中的字符串转换成相应的对象进行注入
spring已经有内置的属性编辑器,我们可以根据需求自己定义属性编辑器
*如何定义属性编辑器?
*继承PropertyEditorSupport类,覆写setAsText()方法
importjava.beans.PropertyEditorSupport;
importjava.text.ParseException;
importjava.text.SimpleDateFormat;
importjava.util.Date;
*java.util.Date属性编辑器
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中
--定义属性编辑器-->
customEditorConfigurer"
org.springframework.beans.factory.config.CustomEditorConfigurer"
customEditors"
map>
entrykey="
java.util.Date"
beanclass="
com.bjsxt.spring.UtilDatePropertyEditor"
format"
value="
/entry>
/map>
/property>
依赖对象的注入方式,可以采用:
*ref属性
*<
ref>
标签
*内部<
bean>
来定义
如何将公共的注入定义描述出来?
*通过<
标签定义公共的属性,指定abstract=true
*具有相同属性的类在<
标签中指定其parent属性
beanAbstract"
abstract="
id"
1000"
name"
Jack"
bean3"
com.bjsxt.spring.Bean3"
parent="
--
Tom"
-->
password"
123"
bean4"
com.bjsxt.spring.Bean4"
Proxy(代理)
静态代理
静态代理只需写一个静态代理类就可以了
publicclassUserManagerImplProxyimplementsUserManager{
privateUserManageruserManager;
publicUserManagerImplProxy(UserManageruserManager){
this.userManager=userManager;
publicvoidaddUser(Stringusername,Stringpassword){
checkSecurity();
this.userManager.addUser(username,password);
publicvoiddeleteUser(intid){
this.userManager.deleteUser(id);
publicStringfindUserById(intid){
returnnull;
publicvoidmodifyUser(intid,Stringusername,Stringpassword){
客户端代码
UserManageruserManager=newUserManagerImplProxy(newUserManagerImpl());
userManager.addUser("
张三"
"
动态代理
动态代理的话就要写一个Handler,通过Handler来生成管理类的代理
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{
Objectret=null;
ret=method.invoke(this.targetObject,args);
}catch(Exceptione){
thrownewjava.lang.RuntimeException(e);
returnret;
SecurityHandlerhandler=newSecurityHandler();
UserManageruserManager=(UserManager)handler.newProxy(newUserManagerImpl());
springBean的作用域
scope可以取值:
*singleton:
每次调用get
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 学堂 Spring 笔记