Java必学的Spring5学习大总结
一、了解Spring基本介绍、主要思想IoCDI1、了解Spring基本介绍(1)Spring是什么?
Spring是一个轻量级的DIIoC和AOP容器的开源框架,致力于构建致力于构建轻量级的JavaEE应用,简化应用开发,本身涵盖了传统应用开发,还拓展到移动端,大数据等领域。(2)Spring有什么优点?与作用?
Spring能帮我们低侵入低耦合地根据配置文件创建及组装对象之间的依赖关系。
Spring面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制等。
Spring能非常简单的且强大的声明式事务管理(通过配置完成事务,不用修改代码)。
Spring提供了与第三方数据访问框架(如Hibernate、JPA)无缝集成,且自己也提供了一套JDBC模板来方便数据库访问。
Spring提供与第三方Web(如Struts12、JSF)框架无缝集成,且自己也提供了一套SpringMVC框架,来方便Web层搭建。
Spring能方便的与如JavaMail、任务调度、缓存框架等技术整合,降低开发难度。2、主要思想IoCDI
Spring是一个DI容器或IoC容器(DI和IoC思想差不多)。掌握着创建对象和构建对象之间的依赖的控制权。IoC:InversionofControl(控制反转):
一种设计思想。其本意是是将原本在程序中手动创建对象的控制权,交由Spring框架来管理。DI:DependencyInjection(依赖注入):
一种设计思想。具体是指Spring创建对象的过程中,将对象依赖属性(常量,对象,集合)通过配置设值给该对象。二、掌握Spring基本使用、Spring获取bean对象的方式、Spring标签import的引入配置1、掌握Spring基本使用(1)依赖jar包:springbeans。jarspringcore。jarcommonslogging。jar(2)配置:创建applicationContext。xml配置文件:配置的约束内容:lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:www。springframework。orgschemabeanshttps:www。springframework。orgschemabeansspringbeans。xsdbeanidhelloclasscom。shan。hello。Hellopropertynamepasswordvalue123propertynameusernamevalueshanspanbeanspanbeansliul(3)使用:TestvoidtestIoC()throwsException{Hellohellonull;1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象ResourceresourcenewClassPathResource(applicationContext。xml);2、创建IoC容器:创建spring的工厂对象(IoC容器对象)BeanFactoryfactorynewXmlBeanFactory(resource);3、从Ioc容器获取对象:从springIoC容器(就是factory工厂对象)中获取指定名称的对象hello(Hello)factory。getBean(hello);hello。printUser();}从例子,可以看出,spring不仅帮我们创建对象,还帮我们把对象需要的数据给设置进来(对象的属性依赖)2、Spring获取bean对象的方式推荐使用:bean的名称类型:TgetBean(Stringname,ClassrequiredType)根据bean对象在容器中的名称类型来获取TestvoidtestIoC()throwsException{Hellohellonull;1、加载配置文件:从classpath路径去寻找配置文件,创建资源对象ResourceresourcenewClassPathResource(applicationContext。xml);2、创建IoC容器:创建spring的工厂对象(IoC容器对象)BeanFactoryfactorynewXmlBeanFactory(resource);3、从Ioc容器获取对象:从springIoC容器(就是factory工厂对象)中获取指定名称的对象方式(推荐):TgetBean(Stringname,ClassrequiredType)根据bean对象在容器中的名称类型来获取hellofactory。getBean(hello,Hello。class);hello。printUser();}3、Spring标签import的引入配置前缀classpathclasspath三、Spring核心对象BeanFactory和Bean、Spring的配置方式、了解Spring管理bean的原理1、Spring核心对象BeanFactory和BeanBeanFactory:是Spring的IoC容器(容器管理对象的生命周期),生产bean对象的工厂,负责配置,创建和管理bean。bean:被SpringIoC容器管理的对象称之为bean。2、Spring的配置方式元数据的配置有三种方式:
XMLbasedconfiguration(xml配置文件)
Annotationbasedconfiguration(注解)
Javabasedconfiguration(基于javaconfig)3、了解Spring管理bean的原理底层是:反射(获取构造器实例对象)内省机制(设置属性值)通过Resource对象加载配置文件解析配置文件,得到指定名称的bean解析bean元素,id作为bean的名字,class用于反射得到bean的实例注意:此时,bean类必须存在一个无参数构造器(且该无参构造器和访问权限无关);调用getBean方法的时候,从容器中返回对象实例;结论:就是把代码从JAVA文件中转移到了XML中。四、使用Spring的测试框架相对于传统测试方式,spring测试框架会帮我们关闭对象资源,而使用传统方式,不会正常关闭spring容器。1、依赖jar包:springtest。jarspringcontext。jarspringaop。jarspringexpression。jar2、配置文件:
SpringTestTest5context。xml文件(文件名必须是测试类context,因为需要跟测试类名对应上):lt;?xmlversion1。0encodingUTF8?beansxmlnshttp:www。springframework。orgschemabeansxmlns:xsihttp:www。w3。org2001XMLSchemainstancexsi:schemaLocationhttp:www。springframework。orgschemabeanshttps:www。springframework。orgschemabeansspringbeans。xsd!配置bean对象beanidsomeBeanclasscom。shan。springtest。SomeBeanbeans3、测试类:
SpringTestTest5类:SpringTest案例测试运行SpringJUnit5SpringJUnitConfigpublicclassSpringTestTest5{表示自动按照类型Spring容器中去找到bean对象,并设置给该字段AutowiredprivateSomeBeanbean;TestvoidtestIoC()throwsException{bean。doWork();}}五、Spring的核心IoC(基于xml)1、ApplicationContext和BeanFactory创建对象的区别BeanFactory在创建Spring容器的时候,并不会立马创建容器中管理的Bean对象,需要等到获取某一个bean的时候才会创建该bean延迟初始化。(懒加载)ApplicationContext在启动Spring容器的时候就会创建所有的bean(在Web应用使用Application)2、常用实例化bean的方式和实现FactoryBean接口实例化的方式(1)实例化bean的方式:构造器实例化(bean中有无参数构造器),标准、常用。beanidsomeBeanclasscom。shan。springtest。SomeBean(2)实现FactoryBean接口实例化的方式:类要实现接口FactoryBean:publicclassDogFactoryimplementsFactoryBeanDog{OverridepublicDoggetObject()throwsException{DogdognewDog();returndog;}OverridepublicClasslt;?getObjectType(){returnDog。class;}}beaniddogclasscom。shan。04factorybean。DogFactory3、bean作用域scope、初始化initmethod和销毁destroymethod(1)bean作用域scope缺省和常用的情况是单例singletonbeanidclassscope作用域单例和多例:singleton:单例(默认的作用域)prototype:多例在web应用中(request、session、application)globalSession:一般用于Porlet应用环境,分布式系统存在全局session概念(单点登录)websocket:将一个bean定义定义到WebSocket的生命周期(2)bean初始化和销毁:属性initmethod该类中初始化方法名和属性destroymethod该类中销毁方法名没有使用spring的测试框架的话,就不能正常关闭IoC容器,即销毁bean对象了(可以手动关闭)beanidcatclasscom。shan。lifecycle。Catinitmethodinitdestroymethodclose六、Spring的核心DI(基于xml):
({color{Violet}{DI跟IoC差不多啦,细节就是DI还负责管理bean对象的属性}})1、xml配置注入属性值:
配置与注入:常量类型配置value注入setter方法对象类型配置ref注入setter方法集合类型配置各自集合对应的元素。。。注入setter方法1、通过XML配置装配(1)XML自动装配(不推荐)通过bean元素的属性autowire自动装配(2)setter注入〔属性注入(根据类型区分)〕(常用)注入常量valuebeanidpersonclasscom。shan。disetter。Personpropertynamenamevalueshanpropertynameagevalue22propertynamesalaryvalue10000spanbean(常用)注入对象refbeanidcatclasscom。shan。disetter2。Catpropertynamenamevaluekityspanbeanbeanidpersonclasscom。shan。disetter2。Personpropertynamenamevalueshanpropertynameagevalue22propertynamecatrefcatspanbeanli注入集合、、、、personclasscom。shan。disetter3。Personpropertynamesetsetvalueset1spanvaluevalueset2spanvaluespansetspanpropertypropertynamelistlistvaluelist1spanvaluespanlistspanpropertypropertynamearrayarrayvaluearray1spanvaluespanarrayspanpropertypropertynamemapmapentrykeykey1valuevalue1spanmapspanpropertypropertynamepropvaluep1v1p2v2spanvaluespanpropertyspanbeanliul2、bean元素继承(本质是xml配置内容的拷贝)通过abstract属性进行抽取通过parent属性进行引入
3、属性注入应用配置数据库连接池动态加载配置文件(db。properties数据库连接的配置信息)使用{}动态引入属性值(1)配置数据库连接池!配置数据库连接池beaniddataSourceclasscom。alibaba。druid。pool。DruidDataSourceinitmethodinitdestroymethodclosepropertynamedriverClassNamevaluecom。mysql。jdbc。Driverpropertynameurlvaluejdbc:mysql:localhost:3306springdemo?useSSLfalsepropertynameusernamevaluerootpropertynamepasswordvalueadminpropertynameinitialSizevalue2bean(2)db。properties数据库连接的配置信息(3)propertyplaceholder要是使用标签Context,需要先引入Context的约束(在beans的基础进行修改即可):
context:propertyplaceholder属性占位符!从classpath的根路径加载db。propertiescontext:propertyplaceholderlocationclasspath:db。properties使用{}动态引入属性值!配置数据库连接池beaniddataSourceclasscom。alibaba。druid。pool。DruidDataSourceinitmethodinitdestroymethodclosepropertynamedriverClassNamevalue{jdbc。driverClassName}propertynameurlvalue{jdbc。url}propertynameusernamevalue{jdbc。username}propertynamepasswordvalue{jdbc。password}propertynameinitialSizevalue{jdbc。initialSize}bean七、Spring使用注解配置1、注解三要素:注解本身、被贴、第三方程序(赋予注解的特殊功能)
对于IoC注解、DI注解:他们的第三方程序是他们对应的解析器。IoC注解:组件扫描器DI注解:注解配置2、DI注解:Autowired、Resource、Valuevalue注解的威力:结合动态properties配置文件引入值变量例如:Value({service。port})(1)通过注解注入属性值配置与注入:常量类型配置value注入Value对象类型配置ref注入AutowiredResource(2)IoC注解:Component、Scope、PostConstruct、PreDestroy使用注解Component(配置Bean)相当于beaniddataSourceclasscom。shan。ioc。MyDataSourceComponent(dataSource)publicclassMyDataSource{}bean组件版型:Component泛指组件Repository持久层Service业务层Controller控制层作用域注解、初始化和销毁注解:Scope、PostConstruct、PreDestroy
({color{Violet}{其中初始化和销毁注解〔依赖:javax。annotationapi。jar〕}})八、SpringAOP1、了解AOP思想〔面向切面编程的思想〕、AOP思想的原理(1)面向切面编程的思想:
利用一种称为横切的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为Aspect,即切面。切面:把一个个的横切关注点放到某个模块中去,称之为切面。那么每一个的切面都能影响业务的某一种功能,切面的目的就是功能增强,如日志切面就是一个横切关注点,应用中许多方法需要做日志记录的只需要插入日志的切面即可。
(2)AOP思想的原理:动态代理2、Pointcot语法找到具体的某个方法哪个包。哪个类。哪个方法execution(修饰符?返回类型声明类型?方法名(参数)异常)切入点表达式中的通配符(看具体的方法,先从方法名位置开始看)::匹配任何部分,但是只能表示一个单词。。。:可用于全限定名中和方法参数中,分别表示子包和0到N个参数。3、AOP开发:(1)依赖jar包:springaop。jarcom。springsource。org。aopalliance。jar〔spring5的springaop。jar已经包含〕com。springsource。org。aspectj。weaver。jar(2)配置:引入AOP的约束:
AOP的3Wwhat、where、when!AOP配置:在什么地点、什么时机、做什么!1、what:做什么增强beanidtransactionManagerclasscom。shan。tx。TransactionManager!属性proxytargetclass配置是否使用真实对象!配置AOP切面!关联what!2、where:在哪些包中的哪些类中的哪些方法上做增强!3、when:在方法执行的什么时机做增强!关联whereaop:aspectaop:config4、AOP增强的分类根据被增强的方法的执行时机分为:前置增强、后置增强、异常增强、最终增强、环绕增强前置增强:权限控制、日志记录等〔被增强的方法执行之前〕后置增强:提交事务、统计分析数据结果等〔被增强的方法正常执行之后(中途没有异常)〕最终增强:回滚事务、记录日志异常信息等〔被增强的方法出现异常〕最终增强:释放资源等〔finally最后操作〕环绕增强:缓存、性能日志、权限、事务管理等〔可以自定义在被增强方法的什么时机执行(返回一个Object,参数processdingJoinpoint)〕5、获取被增强方法的信息,并且可以传递给增强方法【参数Joinpoint类】Joinpoint类连接点,访问被增强方法的真实对象,代理对象,方法参数等可以作为前置、后置、异常、最终增强方法的参数,第一个参数可以作为前置、后置、异常、最终增强方法的参数,第一个参数publicvoidopen(JoinPointjp){System。out。println(开启事务);System。out。println(代理对象:jp。getThis()。getClass());System。out。println(目标对象:jp。getTarget()。getClass());System。out。println(被增强方法的参数:Arrays。toString(jp。getArgs()));System。out。println(连接点方法的签名:jp。getSignature());System。out。println(当前连接点的类型:jp。getKind());}52、环绕增强方法调用真实对象的方法【参数processdingJoinpoint】参数processdingJoinpoint:是JointPoin的子类,只能用于环绕增强,作为第一个参数还可以调用真实对象中被增强的方法。调用真实对象的方法retpjp。proceed();publicObjectaroundMethod(ProceedingJoinPointpjp){Objectretnull;System。out。println(开启事务);try{retpjp。proceed();调用真实对象的方法System。out。println(调用真实对象的方法。。。);System。out。println(提交事务);}catch(Throwablee){System。out。println(回滚事务,错误信息:e。getMessage());}finally{System。out。println(关闭资源);}returnret;}6、使用注解配置AOP(1)AOP注解的解析器【第三方程序,赋予注解的特殊功能】:使用cglib注解:配置属性proxytargetclasstrue!whatbeanidtxManagerclassorg。springframework。jdbc。datasource。DataSourceTransactionManagerpropertynamedataSourcerefdataSourcepropertybean!AOP注解的解析器(2)使用注解Aspect(配置一个AOP切面)配置where配置whenComponentAspect配置一个AOP切面publicclassTransactionManager{wherexml:Pointcut(execution(com。shan。service。。Service。(。。)))publicvoidtxPoint(){}Before(txPoint())publicvoidopen(JoinPointjp){System。out。println(开启事务);}AfterReturning(txPoint())publicvoidcommit(){System。out。println(提交事务);}AfterThrowing(valuetxPoint(),throwingex)publicvoidrollback(Throwableex){System。out。println(回滚事务,异常信息:ex。getMessage());}After(txPoint())publicvoidclose(){System。out。println(关闭资源);}Around(txPoint())publicObjectaroundMethod(ProceedingJoinPointpjp){Objectretnull;System。out。println(开启事务);try{retpjp。proceed();调用真实对象的方法System。out。println(调用真实对象的方法。。。);System。out。println(提交事务);}catch(Throwablee){System。out。println(回滚事务,错误信息:e。getMessage());}finally{System。out。println(关闭资源);}returnret;}}九、SpringDAO1、模板类和基类:
2、pringJDBC【JDBCTemplate模板类】(1)依赖jar包:mysqlconnectorjava。jar【还可以使用德鲁伊连接池:druid。jar】springjdbc。jarspringtx。jar(2)总结JdbcTemplate模板类处理CRUD操作DML操作:publicupdate(Stringsql,Object。。。args)参数:sql?占位符对应的参数返回:受影响的行数DQL操作:publicTListTquery(Stringsql,Object。。。args,RowMapperTrowMapper)参数:sql?占位符对应的参数结果集处理器返回:多行结果集封装的list3、模板类JdbcTemplate的问题与解决NameParameterJdbcTemplate(1)问题:在模板类JdbcTemplate中使用的占位符?【顺序占位符】,需要数第几个,然后写对应的参数,参数多了麻烦面对集合查询in查询时(不确定参数个数),selectfromemployeewhereidin。。。。。in后边不知道该怎么写,是应该写一个?还是(多少个?,都是不确定的)(2)解决:使用NameParameterJdbcTemplate命名的参数JdbcTemplate模板,其实就是在JdbcTemplate外面套一层。允许使用xx来给占位参数起名称,我们需要给名称xx的位置设置参数。
举例:publicintcountOfActorsByFirstName(StringfirstName){Stringsqlselectcount()fromTACTORwherefirstname:firstname;MapString,StringnamedParametersCollections。singletonMap(firstname,firstName);returnthis。namedParameterJdbcTemplate。queryForObject(sql,namedParameters,Integer。class);}十、SpringORM集成mybatis框架十一、Springtx1、Spring的事务管理主要包括3个api:PlatformTransactionManager:根据TransactionDefinition提供的事务属性配置信息,创建事务。TransactionDefinition:封装事务的隔离级别和超时时间,是否为只读事务和事务的隔离级别和传播规则等事务属性。TransactionStatus:封装了事务的具体运行状态。如是否是新开启事务,是否已经提交事务,设置当前事务为rollbackonly。记:常用的事务管理器:JDBCMyBatis:DataSourceTransactionManagerHibernate:HibernateTransactionManager2、事务传播规则TransactionDefinition和常用的情况(1)事务传播规则:
在一个事务方法中,调用了其他事务的方法,此时事务该如何传递,按照什么规则传播。(2)常用的情况:情况一:需要尊重遵从当前事务REQUIRED:(常用)必须存在一个事务,如果当前存在一个事务,则加入到该事务中,否则,新建一个事务。情况二:不遵从当前事务的REQUIRESNEW:(常用)不管当前是否存在事务,都会新开启一个事务。必须是一个新的事务。情况三:寄生事务(外部事务内部事务嵌套事务)NESTED:寄生事务,如果当前存在事务,则在内部事务内执行。如果当前不存在事务,则创建一个新的事务。3、事务配置(基于xml和注解)(1)基于xml:事务增强本质就是AOP增强what、when、where!好比是AOP,事务增强!1、what:配置jdbc事务管理器beanidtxManagerclassorg。springframework。jdbc。datasource。DataSourceTransactionManagerpropertynamedataSourcerefdataSourcebean!2:when:配置事务管理器增强(环绕增强)!关联whattx:adviceidtxAdvicetransactionmanagertxManagertx:attributestx:methodnametranstx:attributestx:advice!3、where:配置切面!关联whenaop:config(2)使用注解配置jdbc事务:tx注解解析器、Transactional注解:Transactional注解属性:name、propagation、isolation、timeout、readonly、rollbackfor、norollbackfor注解第三方解析:beanidtxManagerclassorg。springframework。jdbc。datasource。DataSourceTransactionManagerpropertynamedataSourcerefdataSourcespanpropertyspanbeantx:annotationdriventransactionmanagertxManagerli注解Transactional使用:ServiceTransactionalpublicclassAccountServiceImplimplementsIAccountService{AutowiredprivateIAccountDAOdao;Overridepublicvoidtrans(LongoutId,LonginId,intmoney){dao。transOut(outId,money);inta10;算术异常dao。transIn(inId,money);}若是有查询方法,可以再贴注解Transactional添加注解属性Transactional(readOnlytrue)publicvoidlistXX(){}}ul(3)事务配置(基于注解JavaConfig配置)注解:({color{Blue}{Configuration}})配置({color{Blue}{import(配置子类)}})({color{Blue}{Bean}})配置创建bean对象({color{Blue}{ComponentScan}})IoC注解解析器({color{Blue}{EnableTransactionManagement}})事务注解解析器Transactional配置jdbc事务PropertySource配置引入的属性文件资源({color{Gray}{Component}})泛指组件({color{Gray}{Repository}})持久层({color{Gray}{Service}})业务层({color{Gray}{Controller}})控制层Value配置注入属性值Autowired配置注入属性值