一. ApplicationContext常见三个实现
1.classPathXmlApplicationContext:加载类路径下的配置文件(要求配置文件必须在类路径下,不在的话就加载不了)
2.FileSystemXmlApplicationContext:加载磁盘任意路径下的配置文件(必须有访问权限)
3.AnnotationConfigApplicationContext:读取注解创建容器
二.BeanFactory和ApplicationContext的区别?
ApplicationContext继承BeanFactory接口,是一种更高级的容器,提供了更多功能(Aop,国际化,消息发送)
区别:BeanFactory在启动的时候不会实例化Bean,从容器拿bean的时候才会实例化。
ApplicationContext在启动的时候就把所有Bean实例化
三.创建Bean的三种方式
1.使用构造函数。bean标签只有id和class时使用默认(空参)构造函数创建
2.实例工厂方法。使用工厂中的方法创建
<bean id="" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
3.静态工厂方法。使用工厂中的静态方法创建
<bean id="" class="com.staticFactory" factory-method="getAccountService"></bean>
四.bean的作用范围
设置:bean标签的scope属性
取值:(1)singleton:单例
(2)prototype:多例
(3)request:web应用的请求范围
(4)session:web应用的会话范围
(5)global-session:作用域集群环境会话范围(全局会话)(负载均衡的时候)
五.Bean的生命周期
单例:与容器同生共死
多例:当使用对象时创建,长时间不用且没有别的对象引用,由java垃圾回收器回收。
六. 依赖注入
1.能注入的数据:
(1)string
(2)其它bean类型
(3)复杂类型/集合类型(复杂类型的注入直接用constructor-arg或property 的子标签:array,list,set等)
用于给list结构集合注入的标签:list array set
用于给map结构集合注入的标签:map props
2.注入方式:
(1)构造方法注入
<bean id="" class="">
<constructor-arg type="java.lang.String" value="test"></constructor-arg>
</bean>
constructor-arg标签中有5个属性:
①type:要注入数据的类型
②index:给构造函数指定索引位置赋值
③name:给构造函数中指定名称的参数赋值
④value:提供基本类型和String类型的数据
⑤ref:其它bean类型的数据(容器中配置过的bean)
特点:在获取bean时,注入数据是必须的操作(需要有带参数的构造函数),否则对象无法创建成功
(2)set注入
<bean id="" class="">
<property name="" value=""></property>
</bean>
property标签有3个属性:
①name:指定注入时所调用的set方法的名称
④value:提供基本类型和String类型的数据
⑤ref:其它bean类型的数据(容器中配置过的bean)
特点:创建对象没有明确的限制,可以直接使用默认构造函数
(3)使用注解提供
首先需要在配置文件中开启包扫描:
<context:component-scan base-package=""></context:component-scan>
①@component,@Controller,@Service,@Repository:注册某个类对象。value默认为首字母小写的类名(只有一个value属性时,value可以不写)
②@Autowired:自动按类型注入,容器中有唯一的一个bean类型与要注入的对象类型一致,则注入成功。有多个类型相同,则按id注入。(如果多个类型一致,且没有id匹配,要考虑使用@Qualifier)
③@Qualifier:在按照类型注入的基础上再按照名称注入(要配合@Autowired使用)
④@Resource:直接按照Bean的id注入
⑤@Value:用于注入基本类型和String类型数据(可以使用spring中spel表达式) SPEL的写法:${表达式}
⑥@Scope:用于指定bean的作用范围 Singleton Protorype(默认单例)
⑦@PostConstruct:用于指定初始化方法(加在初始化方法上)
⑧@preDestroy:用于指定销毁方法(加在销毁方法上)
⑨@Configuration:用于指定当前类为一个配置类
⑩@ComponentScan(basepackage="xxx"): 代替配置文件中的<component-scan>
⑪@Bean:用于把当前方法的返回值作为bean对象存入spring的ioc容器中
⑫@Import(JdbcTemplate.class):用于导入其它的配置类
⑬@PropertySource("classpath:xx.properties"):指定properties文件的位置
六.spring整合junit
1.导入spring整合junit的jar(坐标)
2.使用junit提供的一个注解把原有的main方法替换了,替换成spring提供的
@Runwith(springJunit4ClassRunner.class)
3.告知spring的运行器,ioc创建是基于注解还是xml
@ContextConfiguration 属性:locations:指定xml文件的位置 classes:指定注解类所在的位置
@ContextConfiguration(class = Springconfiguration.class)
七.aop
1.概念:把程序重复的代码抽取出来,在需要的时候执行,使用动态代理技术,在不修改源码的基础上对已有的方法增强,降低耦合度
2.相关术语
(1)连接点(Joinpoint):业务层中所有的方法
(2)切入点(PointCut):被增强的方法
(3)通知:前置,后置,异常,最终,环绕(环绕着明确的切入点方法调用)
(4)织入:把增强应用到目标对象的过程
(5)切面:切入点和通知的结合
3.基于xml的aop配置
<aop:config>
<aop:pointcut expression="execution(* cn.ytk.dao.UserDao.*(..))" id="pointcut1"/>
<aop:aspect ref="project">
<aop:before method="before1" pointcut-ref="pointcut1"/>
<aop:after-returning method="after1" pointcut-ref="pointcut1"/>
</aop:aspect>
</aop:config>
(1).aop:config 标签表示开始aop的配置
(2).aop:aspect 标签表明配置切面
id属性:给切面提供一个唯一表示
ref属性:指定通知类bean的id
(3).在aop:aspect标签内部使用对应标签配置通知类型
① aop:before(前置) aop:after-returning(后置) aop:after-throwing(异常) aop:after(最终)
method属性: 指定前置通知方法
pointcut属性:指定切点表达式 execution(访问修饰符 返回值 包名.包名.类名.方法名())
全通配写法:execution(* *..*.*(..))
访问修饰符可省略 包名用*.. 类名和方法名用* 参数用*代表一个或多个类型参数,用..表示匹配所有类型参数
pointcut-ref属性:引入切点表达式
② aop:pointcut
id属性:指明唯一标识
expression属性:指明切点表达式
4.基于注解的aop配置
(1)配置spring开启注解aop的支持
<aop:aspectj-autoproxy></aop:aspectj-autoproxy>
(2)配置切面
@Pointcut("execution(* com.xx.xx.*.*(..)")
peivate void pt1(){}
(3)通知方法前加注解
@Before("pt1()")
@AfterReturning("pt1()")
@AfterThrowing("pt1()")
@After("pt1()")
八.spring事务
1.基于xml声明式事务配置
(1)配置事务管理器
<bean id="transtractionManager" class="org.springframework.xx.">
<property name="datasource" ref="datasource"></property>
</bean>
(2)配置事务的通知
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!--
isolation:事务隔离级别 propagation:事务传播行为
read-only:是否只读 timeout:超时时间
roolback-for:指定一个异常,产生该异常事务回滚,其它异常不会回滚。没默认值,任何都回滚
no-roo;back-for:与roolback-for相反+默认值,任何都回滚
-->
<tx:method name="trans" propagation="REQUIRE" ....>
</tx:attributes>
</tx:advice>
(3)配置aop通用切入点表达式.建立切入点表达式与事务通知对应关系
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.xx.xx.*.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
2.基于注解的声明式事务控制
(1)配置事务管理器
(2)开启spring对注解事务的支持
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
(3)在需要事务支持的地方使用@Transaction注解