1、为什么使用Spring?
- 提供依赖注入(通过依赖注入的方式组装对象),使得开发的系统中的组件之间的耦合性降低(松耦合)。
- 不使用 J2EE 中的技术,也可以通过声明的方式来获得一些服务。
- spring 是一个扩展性非常强的框架,很容易跟其他的框架进行集成,而且可以简化被集成的框架的使用。
- 采用 spring 开发的应用扩展性非常的好,而且开发出来的类都是可重用的。
方式一: 使用类构造器实例化对象
<span style="white-space:pre"> </span><!-- 方式一 使用构造器(无参数)实例化对象 -->
<bean id="bean1" class="cn.itcast.spring.b_instance.Bean1" />
方式二: 使用静态工厂 静态方法,对对象实例化
<span style="white-space:pre"> </span><!-- 方式二 使用静态工厂实例化对象 -->
<!-- 调用 工厂的 factory-method 返回对象 -->
<bean id="bean2" class="cn.itcast.spring.b_instance.Bean2Factory" factory-method="getBean2" />
方式三: 使用实例工厂 实例方法 对对象实例化
<span style="white-space:pre"> </span><!-- 方式三 使用实例工厂实例化对象 -->
<!-- 先实例化工厂 -->
<bean id="bean3Factory" class="cn.itcast.spring.b_instance.Bean3Factory" />
<!-- 再通过工厂对象的实例方法,构造目标对象 -->
<bean id="bean3" factory-bean="bean3Factory" factory-method="getBean3" />
应用场景: 大多数情况,可以通过构造器直接实例化, 只有在对象构造过程非常复杂的情况下,才会采用工厂实例化的方式
如果在配置一个 bean 时,采用的注入方式是 setter 方法注入,那么 spring 容器在创建 bean 时首先调用 bean 的无参构造器,然后调用 bean 的 setter 方法把它所依赖的对象注入进来。
如果在配置一个 bean(bean 类是标准的 javabean)时,采用的注入方式是构造器注入,那么 spring 容器在创建 bean 时调用有参的构造器,并且把它所依赖的对象注入进去。
ApplicationContext 是 BeanFactory 子接口,BeanFactory 才是Spring框架最核心工厂接口。
ApplicationContext 是对BeanFactory 接口扩展, 企业开发很少直接使用BeanFactory
ApplicationContext 会在容器初始化时,对其中管理Bean对象进行创建, BeanFactory 会在对象获取时才进行初始化 。
可以通过 init-method属性配置 Bean对象初始化执行方法,destory-method属性配置Bean对象销毁的方法
(初始化方法和构造方法 有区别? 构造方法作用申请空间,为对象基本属性初始化 , 初始化方法 对象复杂构造过程 , java语言建议将对象复杂构造过程单独抽取 初始化方法 )
在对象构造后,立即执行初始化init , 默认没有执行destroy 销毁方法
8、使用注解配置?
第一步: 新建项目, 导入jar包
第二步: 在需要spring创建对象类上面 添加@Component (注解 来自spring2.5 )
第三步: 配置注解Bean所在package
引入context命名空间
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
配置注解对象所在包
<!-- 通知spring容器 ,注解Bean所在位置 -->
<context:component-scan base-package="cn.itcast.spring" />
Spring为了细分组件的功能,在提供@Component注解,提供三个等价的注解
@Controller 控制器,表示web层组件 ---- action
@Service 业务类,表示业务层组件 --- service
@Repository 表示持久层的组件 --- dao
9、Bean属性的依赖注入?
在spring2.5 版本,没有提供基本类型属性注入 ,但是spring3.0引入注解@Value10、自动装配?
spring2.5 提供自动装配注解 @Autowired
@Autowired 默认按照类型进行注入 (缺点: 如果容器中存在两个对象,是相同类型, @Autowired 无法注入 )
@Autowired + @Qualifier 指定注入Bean的id
Spring支持JSR-250规范,引入@Resource ,功能和@Autowired 相同
总结:
// 方案一: spring3.0 @value 支持spEL
@Value("#{car}")
// 方案二: spring2.5 使用@Autowired 自动装配
@Autowired
@Qualifier("car")
// 方案三: JSR-250 @Resource注解等价于 @Autowired
@Resource(name = "car")
private Car car;
11、Web中使用Spring?
在项目导入 spring-web-3.2.0.RELEASE.jar
第一步:配置监听器
<!-- 监听器,初始化Spring容器对象 -->
<listener>
<span style="white-space:pre"> </span><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
默认加载 /WEB-INF/applicationContext.xml
第二步: 配置spring文件位置
</pre><p><pre name="code" class="html"><!-- 修改spring配置文件位置 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
第三步:修改Servlet代码
// 1、 创建工厂
ApplicationContext applicationContext = (ApplicationContext) this.getServletContext()
<span style="white-space:pre"> </span>.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);
上面代码也可以写为
ApplicationContext applicationContext = WebApplicationContextUtils.getWebApplicationContext(this.getServletContext());
12、什么是AOP?
Aspect Oriented Programming 面向切面编程
业界 AOP 实际上 OOP (面向对象编程 ) 延伸 ---- OOP编程语言、 AOP设计思想
AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码(性能监视、事务管理、安全检查、缓存)
13、AOP相关术语?
Joinpoint(连接点):所谓连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点.
Pointcut(切入点):所谓切入点是指我们要对哪些Joinpoint进行拦截的定义.
Advice(通知/增强):所谓通知是指拦截到Joinpoint之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,最终通知,环绕通知(切面要完成的功能)
Introduction(引介):引介是一种特殊的通知在不修改类代码的前提下, Introduction可以在运行期为类动态地添加一些方法或Field.
Target(目标对象):代理的目标对象
Weaving(织入):是指把增强应用到目标对象来创建新的代理对象的过程.
spring采用动态代理织入,而AspectJ采用编译期织入和类装在期织入
Proxy(代理):一个类被AOP织入增强后,就产生一个结果代理类
Aspect(切面): 是切入点和通知(引介)的结合
14、Spring事务管理一些类?
平台事务管理器 PlatformTransactionManager
在使用Spring管理事务,需要为不同持久层技术实现,提供不同事务管理器(实现类)
对Jdbc、ApacheDbUtils、JdbcTemplate、MyBatis 进行事务管理
---- DataSourceTransactionManager
对Hibernate 进行事务管理
---- HibernateTransactionManager
15、事务的隔离机制?
DEFAULT 每种数据库提供默认隔离级别 mysql REPEATABLE_READ、oracle READ_COMMITTED
READ_UNCOMMITTED:引发所有隔离问题(脏读、不可重复读、虚读)
READ_COMMITTED:解决脏读, 引发(不可重复读、虚读)
REPEATABLE_READ : 解决脏读、不可重复读、 引发虚读
SERIALIZABLE :事务不存在并发性,阻止所有并发问题发生 (不推荐)
16、事务的传播行为?
17、Spring事务管理两种方式?
编程式事务管理 和 声明式事务管理
1、 编程式事务,需要代码侵入 ,使用TransactionTemplate 模板类 (企业不用)
transactionTemplate.execute(new TransactionCallbackWithoutResult(){
T doInTransaction(){
// 数据库操作代码
}
});
doInTransaction方法只要发生异常,事务回滚,没有异常,事务提交
2、 声明式事务管理 ,无需要修改原来代码,只需要配置,为目标代码添加事务管理 , AOP底层实现 --- 企业推荐
18、Spring使用声明式事务?
说明:事务 依赖 AOP , AOP需要定义切面, 切面由Advice(通知) 和 PointCut(切点) 组成 !
---- Spring框架内部,提供事务管理Advice
第一步: Spring 为了简化事务配置,引入tx标签 ,在applicationContext.xml 引用tx 的命名空间
第二步: 使用tx标签,配置Advice
事务管理器:
Advice:
第三步:配置切面
Spring事务管理Advice,是基于Spring 传统AOP, 所以使用aop :advisor配置
19、如何使用注解实现声明式事务管理?
第一步: 在配置文件中, 激活使用注解进行事务管理
第二步: 在需要管理事务的业务类(业务方法)上添加@Transactional 注解
可以在注解中配置事务属性