Spring框架

Spring框架知识点:

备注:3-8的配置都是xml配置

1、Spring框架的理解

Spring的核心是IoC容器和AOP面向切面编程,可以使得代码低耦合、高内聚

将对象Bean的创建权交由Spring完成减少代码量,可以从IoC容器中按需取对象;

基于JDKCglibAOP面向切面编程,可以在配置文件中增强某些方法的功能,同时 还支持事务的配置。

2、IoC容器

Spring中通过一个集合用于存储项目中需要使用到的Bean对象,在需要使用的时候 可以直接从这个集合中取出对应的对象即可。(Java本身就是面向对象编程,在编程中 就是使用各种对象实现项目功能,将需要使用到的对象存储在一个集合中,可以任何需 Bean对象的地方从容器中取出对象)

3、IoC容器中Bean对象的配置

1)无参数构造方法配置(直接配置class属性为指定Bean的全包名即可)

2)静态工厂配置(配置class属性为静态工厂类的全包名,然后指定factory-method 性即可)

3)实例工厂配置(首先得配置实例工厂对象,然后再配置factory-beanfactory-method 即可)

4、依赖注入

在某些Bean对象中,如果需要使用到其他的对象共同实现一个功能,为了方便在该对 象内部方便使用其他对象,而不需要在每个方法内部重新new一个对象或者从IoC容器 中反复地取出对应的对象,可以将一个这个对象当作该Bean的属性注入。将一个对象 当作一个属性输入到另一个对象内部,可以通过set方法或者构造器实现。

set方法注入:在Bean标签内部,添加property属性标签为目标属性注入需要的对象。

构造器注入:在Bean标签内部,添加constructor-arg标签并指定构造器需要的参数。

备注:

1)依赖注入注入的引用数据类型,注入的对象都需要已经配置到了IoC容器,方便 同一管理。如果可以直接在property标签中指定某个属性(即这个属性可以看作是 直接量,它不会出现在IoC容器中,通过ref属性引用的是IoC容器中配置的Bean 对象)。

2)如果需要注入ListMapProperties对象,在propertity属性内部可以添加对应的 listmapprops标签即可。

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

@Scopesingleton\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实现接口(ProxyInvocationHandle

2)Cglib是基于父类的,被增强的target不需要实现接口(EnhancerMethodInterceptor

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-jdbcspring-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 技术是jdbcmybatis时,实现类采用是 DataSourceTransactionManager,当Dao 层技术是hibernate时,实现类采用 HibernatTransactionManager

TrasactionDefination:是定义事务的信息对象;

设置事务的隔离级别:(解决事务并发产生的,如脏读、不可重复读、虚读)

defaultISOLATION_DEFAULT

uncommitedISOLATION_UNCOMMITED

commitedISAOLATION_COMMITED

repeatable_readISOLATION_REPEATABLE_READ

serializableISOLATION_SERIALIZABLE

设置事务的传播行为:(用于解决业务方法调用业务方法的情况,对多个事务进行 统一管理)

REQUIRED:业务A调用业务B,如果A没有被事务管理,则新建一个事务;如 A 有事务,则加入该事务;

SUPPORT:业务A调用业务B,如果A没有被事务管理,则以非事务运行;如 A 有事务,则加入该事务。

还有其他参数,不做阐述。

设置超时时间

设置是否只读

TransactionStatus:接口,提供事务控制的运行状态;

对于这个对象是由Spring进行事务控制的时候自己维护的。

19、事务的配置(xml

前面已经提到了,事务控制的底层就是aopSpring中的事务管理器可以理解成切面类。

步骤:

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”>

posted @ 2020-05-17 08:22  wuyiping  阅读(177)  评论(0编辑  收藏  举报