配置bean
配置形式:基于xml文件的方式;基于注解的方式。
Bean的配置方式:通过全类名(反射),通过工厂方式(静态工厂方法&实例工厂方法)、FactoryBean
IOC容器的applicationContext&BeanFactory概述
依赖注入的方式:属性(set)注入,构造注入。(构造注入用index区分第几个参数,用type匹配类型)
注入属性值细节
自动装配 byName&byType
bean之间的关系:继承;依赖
bean的作用域:singleton;prototype;WEB环境作用域
使用外部属性文件
speL
IOC容器中bean的生命周期
Spring 4.x新特性:泛型依赖注入
spring通过注解配置bean
spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。
特定组件包括:
@component:基本注解,表示一个受spring管理的组件。
@respository:标识持久层组件
@service:标识逻辑层(业务层)组件
@Controller:标识表现层组件
当在组件类上使用了特定的注解之后,还需要在spring的配置文件中声明<context:component-scan>:
-----base-package属性制定一个需要扫描的基类包,Spring容器将会扫描这个基类包里及其子包中的所有类。
-----当需要扫描多个包时,可以使用逗号隔开
-----如果仅仅希望扫描特定类而不是非基包下的所有类,可使用resource-patterm属性过滤特定的类。
----<contect:include-filter>子节点表示要包含的目标类。
----<contect:exclude-filter>子节点表示排除在外的目标类。
----<context:component-scan>下可以拥有若干个<contect:include-filter>子节点和<contect:exclude-filter>子节点。
组件装配
@Autowired注解自动装配具有兼容性的单个Bean。@Autowired可以在放在构造器,普通字段等一切具有参数方法都可以应用。
默认情况下所有的@Autowired注解的属性都要被设置,找不到配置就会抛出异常。若某一属性允许不被配置,可以设置@Autiwired注解的required属性为FALSE.
AOP
AOP(面向切面编程):主要编程对象是切面,而切面模块化横切关注点。
aop的好处:
----每个事物逻辑位于一个位置,代码不分散,便于维护和升级。
----业务模块更简洁,指包含核心业务代码
eg:每个方法前后的验证和日志,如果在每个方法都加,会很臃肿。所以抽取横切关注点。
AOP的配置:
----基于AspectJ配置AOP
1、要在Spring应用中使用AspectJ注解,必须在classpath下包含AspectJ类库:aopalliance.jar、aspectj.weaver.jar和spring-aspects.jar
2、将aop Schema添加到<beans>根元素中(application.xml中头部)。
3、要在SpringIOC容器中启用AspectJ注解支持,只要在Bean配置文件中定义一个空XML元素<aop:aspectj-autoproxy>
当SpringIOC容器侦测到Bean配置文件中的<aop:aspectj-autoproxy>元素,会自动与AspectJ切面匹配的Bean创建代理。
4、把横切关注点的代码抽象到切面类中。切面首先在IOC中配置一个Bean,再在类前加@Component注解和@AspectJ注解。
5、在类中声明各种通知(@Before前置通知,@After后置通知,@AfterRunning返回通知,在方法返回结果之后执行,@AfterThrowing异常通知,在方法抛出异常之后,@Around环绕通知,围绕着方法执行)
----基于XML配置AOP
AOP优先级:
可以通过@Order注解指定切面的优先级,值越小优先级越高。
使用@Pointcut来声明切入点表达式,后面的其他通知直接使用方法名来引用当前的切入点表达式。
事务
一系列的动作被当作一个独立单元,要么都完成要么都不起作用。
原子性:要么都完成要么都不起作用。
一致性:一旦事务动作完成,事务被提交,数据和资源就处于一种满足业务规则一致性的状态中。
隔离性:可能会有很多事物会同时处理相同的数据,因此每个事物都应该与其他事务隔离开来,防止数据损坏。
持久性:一旦事务完成,无论发生什么系统错误,它的结构都不受影响。通常情况下,事物的结果被写道持久化存储器中。
配置事务:
1、在applacationContext.xml中配置事务管理器DataSourceTransationManager
2、启用事务注解驱动
3、在方法前边加注解@Transational
spring支持事务的传播行为
required -----如果事务在运行,就用当前事务,否则就启动一个新事务。
required_new ----当前的方法必须启动新事务,并在他的新事务内运行。如果有事务在运行,应该将它挂起
supports ---如果有事务在运行,就在当前事务运行,否则它可以不运行在事务中
not_supports ---当前方法不应该在事务中,如果有运行事务,将其挂起。
mandatory ---当前方法必须在事务中运行,如果有正在运行的事务,就抛出异常
never ---当前方法不应该运行在事务中,如果没有正在运行的事务,就抛出异常
nested ---如果有事务在运行,当前方法应该嵌套在事务内运行,否则启动一个新事务,并在自己的事务内运行。
@Transational使用propagation指定事务的传播行为
@Transational(propagation=Propagation.REQUIRED)
出来通过注解使用事务,还可以通过xml配置来使用事务。