Spring框架
Spring框架知识点:
备注:3-8的配置都是xml配置
1、Spring框架的理解
Spring的核心是IoC容器和AOP面向切面编程,可以使得代码低耦合、高内聚
将对象Bean的创建权交由Spring完成减少代码量,可以从IoC容器中按需取对象;
基于JDK和Cglib的AOP面向切面编程,可以在配置文件中增强某些方法的功能,同时 还支持事务的配置。
2、IoC容器
在Spring中通过一个集合用于存储项目中需要使用到的Bean对象,在需要使用的时候 可以直接从这个集合中取出对应的对象即可。(Java本身就是面向对象编程,在编程中 就是使用各种对象实现项目功能,将需要使用到的对象存储在一个集合中,可以任何需 要Bean对象的地方从容器中取出对象)
3、IoC容器中Bean对象的配置
1)无参数构造方法配置(直接配置class属性为指定Bean的全包名即可)
2)静态工厂配置(配置class属性为静态工厂类的全包名,然后指定factory-method属 性即可)
3)实例工厂配置(首先得配置实例工厂对象,然后再配置factory-bean和factory-method 即可)
4、依赖注入
在某些Bean对象中,如果需要使用到其他的对象共同实现一个功能,为了方便在该对 象内部方便使用其他对象,而不需要在每个方法内部重新new一个对象或者从IoC容器 中反复地取出对应的对象,可以将一个这个对象当作该Bean的属性注入。将一个对象 当作一个属性输入到另一个对象内部,可以通过set方法或者构造器实现。
set方法注入:在Bean标签内部,添加property属性标签为目标属性注入需要的对象。
构造器注入:在Bean标签内部,添加constructor-arg标签并指定构造器需要的参数。
备注:
1)依赖注入注入的引用数据类型,注入的对象都需要已经配置到了IoC容器,方便 同一管理。如果可以直接在property标签中指定某个属性(即这个属性可以看作是 直接量,它不会出现在IoC容器中,通过ref属性引用的是IoC容器中配置的Bean 对象)。
2)如果需要注入List、Map或Properties对象,在propertity属性内部可以添加对应的 list、map、props标签即可。
5、分模块开发
如果配置项特别多,都配置在一个applicationContext.xml文件的话,不利于维护,可以将配置文件按模块或功能进行拆分,然后在一个主配置文件中引入其他配置文件,在创建IoC容器的时候只需要指定主配置文件即可。使用import标签,引入其他的配置文件。(主要注意的是,不要配置重复项,配置文件不允许重复的id)
6、Spring中相关API
applicatonContext:接口,应用上下文对象,指的就是IoC容器;
applicationContext的实现类:
1)ClassPathXMLapplicationContex:从类加载路径下加载配置文件;
2)FileSystemXmlApplicationContext:从指定的磁盘路径下加载配置文件;
3)AnnotationConfigApplicationContext:当使用注解配置applicationContext.xml文件的 时候,使用配置类加载配置项。
从IoC容器中取对象:
1)Object getBean(String id);(id具有唯一性,不会出错,但是需要强转为目标类型)
2)<T> T getBean(class<T> requiredType);(IoC容器中存在多个同类型的对象会报错)
7、第三方Bean的配置
跟自定义Bean的配置一样,指定第三方Bean的全包名就行。例如,数据源的配置。
8、Properties文件注入和引用
可以在applicationContext.xml文件中使用context:property-placeholder注入properties 文件,然后可以使用SPEL表达式获取properties配置文件中的value。
备注:需要在配置文件中引入context命名空间
9、Spring的注解开发
Spring是轻代码重配置的框架,xml配置会比较繁琐,使用注解配置会大大简化配置, 提高开发效率。
1)Spring中的原始注解
原始注解是Spring中比较早期的注解,功能有限,譬如不能配置第三方Bean、 properties配置文件、组件扫描、分模块配置,不能完全取代applicationContext.xml。
修饰类:
@Component
@Controller
@Service
@Repository
@Scope:singleton\prototype\request\session\global session
修饰属性:
@Autowired:按类型注入
@Autowired+@Qualifier:按id注入
@Resource:等同于@Autowired+@Qualifier,有name属性,按id注入
@Value:注入普通属性(String、基本数据类型、SPEL表达式(取properties中的value))
修饰方法:
@PostConstruct
@PreDestroy
备注:如果使用原始注解进行配置,需要在applicationContext.xml文件中指定使用 到了注解配置的类,即开启组件扫描。
<context:component-scan base-package = “包名”>
解释:使用原始注解配置时,并不能完全取代applicationContext.xml文件,此时还 是通过读取配置文件生成IoC容器的,Spring框架并不会自动去读取原始注解。
备注:
2)Spring中的新注解
后期为了补充Spring原始注解的不足,增加了些下注解,可以完全取代 applicationContext.xml文件。
修饰类
@Configuration:用于指定当前类是一个配置类;
@ComponentScan:组件扫描
@PropertySource:加载properties配置文件
@Import:分模块开发,引入其他配置类
修饰方法
@Bean:将方法的返回值放入IoC容器
10、Spring整合Junit
在测试Spring项目的时候,每次都需要获取ApplicationContext对象,为了简化测试, Spring提供类了整合Junit的方案,在测试类中Spring会自动创建IoC容器,可以直接 注入需要测试的对象,然后在测试方法中测试即可。
测试中需要用到的注解:
修饰测试类
@RunWith(SpingJUnit4ClassRunner):
@ContextConfiguration:指定配置文件位置
修饰成员变量
@Autowire:依赖注入注解或者@Qualifier\@Resource等,使用方法同上
修饰测试方法
@Test
11、Spring AOP的理解
AOP指的是面向切面编程,是通过预编译方法和运行期间动态代理实现程序功能的统一 维护。
AOP底层:基于JDK动态代理和Cglib动态代理
1)JDK是基于接口的,被增强的target实现接口(Proxy和InvocationHandle)
2)Cglib是基于父类的,被增强的target不需要实现接口(Enhancer和MethodInterceptor)
12、Spring AOP的配置(xml配置)
Spring会监控aop中配置的方法,当系统调用该方法时,会动态生成代理对象,然后再 用代理对象调用该方法。aop需要配置目标对象和切面类,然后配置织入,指定目标对 象的哪些方法(切点)需要哪些增强(切面方法)。
配置步骤:
1)引入aop命名空间
2)配置目标对象和切面对象的Bean;
3)配置织入
<aop:config>
<aop:aspect ref=”切面对象id”>
<aop:before method=”方法名” pointcut=”切点表达式)”></aop:before>
</aop:aspect>
</aop:config>
切点表达式的书写:
1、execution([访问修饰符] 返回值类型 包名.类名.方法名(参数列表));
2、访问修饰符可写可不写;
3、返回值类型、全包名、类名都可以使用*表示任意返回值;
4、包名和类名之间可以使用一个点.表示当前包下的类,两个点..表示当前包及其 子包下的类;
5、参数列表可以使用两个点..表示任意参数列表。
13、AOP中增强方法的类型(配置)
aop:before:被增强方法执行执行之前执行;
aop:after-returning:被增强的方法执行完之后执行;
aop:around:定义的环绕增强方法需要指定ProcedingJointPoint参数,指的是需要增强的 方法;
aop:after-throwing;:抛出异常时执行;
aop:after:不断抛不抛异常,都会执行;
14、切点表达式的抽取
切点表达式本质就是指定那些方法需要被增强,有时候多个切点增强同一个方法,此时 就需要重复写这个被增强方法的切点表达式,为了避免重复,增强可维护性,可以将切 点表达式进行抽取,在需要使用该切点表达式的地方直接引用即可。
<aop:pointcut id=”唯一标识” expression=”切点表达式”>
在引用的地方使用pointcut-ref属性进行引用。
15、基于注解的AOP配置
配置步骤:
1)配置目标对象和切面对象的Bean;
都使用@Component修饰,切面类还需要使用@Aspect修饰
2)在切面类中使用注解配置织入关系;
修饰方法(参数指定切点)
@Before
@AfterReturning
@Around
@AfterThrowing
@After
3)在applicationContext.xml中配置组件扫描和aop自动代理。
<context:component-scan base-packsge = “包名”>
<aop:aspectj-autoproxy>
备注:@Pontcut(“切点表达式”)可以对切点进行抽取配置,由于注解用于修饰方法,可 以采用以空的方法,加上该注解就行,然后引用该切点表达式的时候指定类名. 方法()即可。
16、Spring JdbcTemplate
理解:
该对象对基于java操作数据库的代码进行了封装,方便操作数据库、可以自动封装 查找的对象,支持事务管理。该模板对象需要注入数据源对象,然后使用该对象即可实 现对数据库的增删改查,在操作数据库的时候该模板对象会自动从数据源从获取数据库 连接对象。
导包:
需要导入spring-jdbc和spring-tx两个坐标
spring-jdbc封装类JdbcTemplate模板对象;
spring-tx封装类事务管理。
17、JdbcTemplate事务控制理解
声明式事务控制指的是使用代码手动控制事务;
声明式事务控制指的是使用配置文件自动对事物进行控制;
虽然Spring是采用声明是事务控制的,但是底层还是通过相关的类进行实现的,只不 过是对java原生的事务控制进行了封装,因此在对Spring进行事务声明式事务控制的 本质就是对Spring中控制事务的对象进行配置,而Spring通过配置对事务进行控制其 本质还是通过aop。(可以采用before方法开启事务,after-throwing回滚事务, after-returning提交事务)
18、Spring中控制事务的API
Spring底层对事务的控制进行了封装
PlatformTransactionManager:接口,是Spring的事务控制管理器;
TransactionStatus getTransaction(TransactionDefination defination);
void commit();
void rollback();
注意:不同的Dao层技术实现事务管理的底层原理是不同的,该接口是设置对事 务控制的一种规范,针对不同的Dao层,该接口有不同的实现类,例如当Dao层 技术是jdbc或mybatis时,实现类采用是 DataSourceTransactionManager,当Dao 层技术是hibernate时,实现类采用 HibernatTransactionManager。
TrasactionDefination:是定义事务的信息对象;
设置事务的隔离级别:(解决事务并发产生的,如脏读、不可重复读、虚读)
default(ISOLATION_DEFAULT)
uncommited(ISOLATION_UNCOMMITED)
commited(ISAOLATION_COMMITED)
repeatable_read(ISOLATION_REPEATABLE_READ)
serializable(ISOLATION_SERIALIZABLE)
设置事务的传播行为:(用于解决业务方法调用业务方法的情况,对多个事务进行 统一管理)
REQUIRED:业务A调用业务B,如果A没有被事务管理,则新建一个事务;如 果A 有事务,则加入该事务;
SUPPORT:业务A调用业务B,如果A没有被事务管理,则以非事务运行;如 果A 有事务,则加入该事务。
还有其他参数,不做阐述。
设置超时时间
设置是否只读
TransactionStatus:接口,提供事务控制的运行状态;
对于这个对象是由Spring进行事务控制的时候自己维护的。
19、事务的配置(xml)
前面已经提到了,事务控制的底层就是aop,Spring中的事务管理器可以理解成切面类。
步骤:
1、引入tx命名空间;
2、配置事务管理器DataSourceTransactionManager
该对象需要数据源对象
3、<tx:advice id =”唯一标识” transaction-manager =”2中配置的事务管理器对象id”>, 在这个标签内部配置需要增强的方法(这个配置的是事务的属性信息,事务的隔离 级别、传播行为、超时时间、是否只读,每一组属性是针对一个被增强的方法而言 的,也可使用*通配符表示所有的方法采用一组事务属性)。
4、配置事务的织入
<aop:config>
<aop:adviser advice-ref = “切面类id” pointcut = “切点表达式”/>
</aop:config>
(跟aop的配置类似,配置切面类然后指定切点)
20、事务的配置(注解)
@Transactional(事务的隔离级别和传播行为)
可以用于修饰类和方法,修饰类则该类里面的方法全部都被事务管理,修饰方法则 仅该方法被事务管理。
还需要在applicationContext.xml中配置事务的注解驱动
1)配置平台事务管理器对象
2)<tx:annonation-driven transaction-manager=”平台事务管理器id”>