spring学习.docx
- 文档编号:11116969
- 上传时间:2023-05-29
- 格式:DOCX
- 页数:36
- 大小:56.62KB
spring学习.docx
《spring学习.docx》由会员分享,可在线阅读,更多相关《spring学习.docx(36页珍藏版)》请在冰点文库上搜索。
spring学习
1、bean的三种使用方式:
1.1使用BeanWrapper
HelloWorldhelloWorld1=newHelloWorld();
BeanWrapperbw=newBeanWrapperImpl(helloWorld1);
//BeanWrapperbw=newBeanWrapperImpl(HelloWorld.class);
bw.setPropertyValue("msg","helloWorld1");
System.out.println(bw.getPropertyValue("msg"));
System.out.println(bw.getWrappedClass());
1.2使用BeanFactory
Resourceresource=newFileSystemResource("src/config.xml");
//Resourceresource=newClassPathResource("config.xml");
BeanFactorybf=newXmlBeanFactory(resource);
HelloWorldhelloWorld2=(HelloWorld)bf.getBean("HelloWorld");
//HelloWorldhelloWorld2=bf.getBean(HelloWorld.class);
System.out.println(helloWorld2.getDate()+""+helloWorld2.getMsg());
1.3使用ApplicationContext
ApplicationContextactx=newFileSystemXmlApplicationContext("src/config.xml");
//ApplicationContextactx=newClassPathXmlApplicationContext("config.xml");
//GenericXmlApplicationContextactx=newGenericXmlApplicationContext("config.xml");
HelloWorldhelloWorld3=(HelloWorld)actx.getBean("HelloWorld");
System.out.println(helloWorld3.getDate()+""+helloWorld3.getMsg());
2、bean的初始化和销毁(*)
2.1bean的初始化:
2.1.1方法一:
bean中设置init-method
2.1.2方法二:
bean类实现org.springframework.beans.factory.InitializingBean接口,
实现afterPropertiesSet方法。
2.2bean的销毁:
2.2.1方法一:
bean中设置destroy-method
2.2.2方法二:
bean类实现org.springframework.beans.factory.DisposableBean接口,
实现destroy方法。
3、集合的注入方式
3.1List
3.2Set
3.3Map
3.4Properties
4、访问资源文件
ApplicationContextactx=newClassPathXmlApplicationContext("config.xml");
4.1方法一:
用classpass路劲,是spring约定的URL虚拟路劲
Resourceresource1=actx.getResource("classpath:
messages.properties");
System.out.println(resource1);
4.2方法二:
标准的URL路径,例如file:
或http:
Resourceresource2=actx.getResource("file:
D:
/workspace/myusers/src/messages.properties");
System.out.println(resource2);
4.3方法三:
通过相对路劲
Resourceresource3=actx.getResource("src/messages.properties");
Resourceresource4=actx.getResource("WebContent/WEB-INF/classes/messages.properties");
System.out.println(resource3);
System.out.println(resource4);
5、Java代理
接口:
publicinterfaceTimeBookInterface{
publicvoiddoAuditing(Stringname);
}
实现类:
publicclassTimeBookimplementsTimeBookInterface{
@Override
publicvoiddoAuditing(Stringname){
System.out.println("审核数据的相关程序正在执行...");
}
}
测试代码:
newTimeBook().doAuditing("张三");
5.1java代理(简单代理)
publicclassTimeBookProxy{
privateLoggerlogger=LoggerFactory.getLogger(TimeBookProxy.class);
privateTimeBookInterfacetimeBookInterface;
publicTimeBookProxy(TimeBookInterfacetimeBookInterface){
this.timeBookInterface=timeBookInterface;
}
publicvoiddoAuditing(Stringname){
logger.info(name+"开始审核");
timeBookInterface.doAuditing(name);
logger.info(name+"审核结束");
}
}
测试代码:
TimeBookProxytimeBookProxy=newTimeBookProxy(newTimeBook());
timeBookProxy.doAuditing("张三");
5.2java动态代理
publicclassLogProxyimplementsInvocationHandler{
privateLoggerlogger=LoggerFactory.getLogger(this.getClass());
privateObjectdelegate;
publicObjectbind(finalObjectdelegate){
//返回的是delegate对象的代理
this.delegate=delegate;
returnProxy.newProxyInstance(delegate.getClass().getClassLoader(),delegate.getClass().getInterfaces(),this);
}
@Override
publicObjectinvoke(Objectproxy,Methodmethod,Object[]args)throwsThrowable{
Objectresult=null;
try{
logger.info(args[0]+"开始审核");
result=method.invoke(delegate,args);
logger.info(args[0]+"审核结束");
}catch(Exceptione){
logger.info(e.toString());
}
returnresult;
}
}
测试代码:
LogProxylogProxy=newLogProxy();
TimeBookInterfacetimeBookProxy2=(TimeBookInterface)logProxy.bind(newTimeBook());
timeBookProxy2.doAuditing("李四");
总结:
Java动态代理优于简单的代理,动态代理机制强大,spring的AOP正式建立在java的动态代理基础上的。
6、spring的AOP
6.1AOP与OOP的区别
AOP全称是AspectOrientedProgramming,OOP是ObjectOrientedProgramming。
在遇见日志、事务处理、权限管理问题时,当应用OOP将这些内容封装为对象行为时,会产生大量的重复代码,AOP可以很好的降低代码的耦合度。
6.2AOP的三个关键概念
(1)切入点(Pointcut):
Pointcut是JoinPoint(连接点的集合),JoinPoint是指程序中的某个阶段点,如某个方法调用、异常抛出。
(2)通知(Advice):
Advice是某个连接点所采用的处理逻辑。
(3)Advisor:
Pointcut和Advisor的配置器。
6.2.1切入点(Pointcut)的三种实现方式:
(1)静态切入点,org.springframework.aop.support.RegexpMethodPointcutAdvisor是一个通用的正则表达式切入点。
(重点)
(2)动态切入点。
(3)自定义切入点。
6.2.2通知(Advice)的五中类型:
(1)InterceptionAround类型:
是spring的最基本通知类型,实现org.aopalliance.intercept.MethodInterceptor接口;
(2)Before类型:
实现org.springframework.aop.MethodBeforeAdvice接口;
(3)AfterReturning类型:
org.springframework.aop.AfterReturningAdvice接口;
(4)Throw类型:
实现org.springframework.aop.ThrowsAdvice接口;
(5)Introduction类型:
实现org.springframework.aop.IntroductionAdvisor、org.springframework.aop.IntroductionInterceptor接口。
6.3AOP模型
6.3.1模型一(Java动态代理):
目标类+Advice+代理类(ProxyFactoryBean代理目标类的所有方法)
--目标类-->
--*****Advice为InterceptionAround类型(实现MethodInterceptor接口)*****-->
--**Advice的设置**-->
--设定代理类-->
--这里代理的是接口-->
--若用CGLIB代理则将proxyInterfaces替换成下面的proxyTargetClass-->
--
--程序中的Advice-->
--是ProxyFactoryBean要代理的目标类-->
6.3.2模型二(Java动态代理):
目标类+Advisor+代理类(ProxyFactoryBean代理目标类的指定方法)
--目标类-->
--*****Advice为InterceptionAround类型(实现MethodInterceptor接口)*****-->
--**Advice的设置**-->
--**Pointcut的设置、Advisor的设置**,代理目标类的指定方法-->
--指定要代理的方法-->
--设定代理类-->
--这里代理的是接口-->
--若用CGLIB代理则将proxyInterfaces替换成下面的proxyTargetClass-->
--
--是ProxyFactoryBean要代理的目标类-->
--程序中的Advisor-->
6.3.3模型三(CGLIB代理):
目标类+Advisor+代理类(ProxyFactoryBean代理目标类的指定方法)
--目标类-->
--*****Advice为InterceptionAround类型(实现MethodInterceptor接口)*****-->
--**Advice的设置**-->
--**Pointcut的设置、Advisor的设置**,代理目标类的指定方法-->
--指定要代理的方法-->
--设定代理类-->
--若用CGLIB代理-->
--是ProxyFactoryBean要代理的目标类-->
--程序中的Advisor-->
6.3.4模型四(自动代理):
目标类+自动代理类+Advisor
--目标类-->
--自动代理类-->
--Advice的设置-->
--Advisor的设置-->
注:
自动代理的目标类可以有接口,也可以没有接口。
即可以转换为java自动代理,也可以转换为CGLIB代理。
7、spring的事务
7.1事务的四大特性
(1)原子性(Atomicity):
原子性要求事务所包含的全部操作是一个不可分割的整体,这些操作要么全部提交成功,要么只要其中一个操作失败,就全部失败。
(2)一致性(Consistency):
一致性要求事务所包含的操作不能违反数据资源的一致性检查,数据资源在事务执行之前处于一个数据的一致性状态,那么,事务执行之后也需要依然保持数据间的一致性状态。
(3)隔离性(Isolation):
事务的隔离性主要规定了各个事务之间相互影响的程度。
隔离性概念主要面向对数据资源的并发访问(Concurrency),并兼顾影响事务的一致性。
当两个事务或者更多事务同时访问同一数据资源的时候,不同的隔离级别决定了各个事务对该数据资源访问的不同行为。
(4)持久性(Durability):
事务的持久性是指一旦整个事务操作成功提交完成,对数据所做的变更将被记载并不可逆转
注:
事务的隔离性,事务指定四种类型的隔离级别,隔离程度按照从弱到强分别为“ReadUncommitted”,“ReadCommitted”,“RepeatableRead”和“Serializable”。
下面分别介绍四种隔离级别。
(1)ReadUncommitted.最低的隔离级别,ReadUncommitted最直接的效果就是一个事务可以读取另一个事务并未提交的更新结果。
ReadUncommitted是以较低的隔离度来寻求较高的性能,其本身无法避免以下几个问题:
脏读(DirtyRead).如果一个事务中对数据进行了更新,但事务还没有提交,另一个事务可以“看到”该事务没有提交的更新结果,这样造成的问题就是,如果第一个事务回滚,那么,第二个事务在此之前所“看到”的数据就是一笔脏数据。
不可重复读取(Non-RepeatableRead).不可重复读取是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。
如果事务1在事务2的更新操作之前读取一次数据,在事务2的更
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- spring 学习