⒈ Spring核心理念
Spring 是一个 IOC 和 AOP 容器框架。
⑴ 控制反转(IOC)
传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用 spring 容器来实例化,这是控制反转的思想。
总结spring使用步骤:
① 在applicationContext.xml文件中配置bean:
② 创建一个AppliCationContext对象:
ApplicationContext它是BeanFactory的一个子接口,我们在使用时使用的是AppliCationContext的实现类ClassPathXmlApplicationContext。可以通过getBean(配置文件中id名称)来获取指定的对象。
⑵ 依赖注入(DI)
在spring框架负责创建Bean对象时,动态将依赖对象注入到Bean组件。
简单说,这时UserServiceImpl中的info属性值就是ITCAST。
注意:IOC和DI区别?
IOC 控制反转,是指对象实例化权利由spring容器来管理,本质是通过xml配置文件+反射+factory来实现的;
DI 依赖注入,在spring创建对象的过程中,对象所依赖的属性通过配置注入对象中。
在spring中bean的属性注入有两种方式,如下 :
① 构造器注入;
使用ref来引入另一个bean对象,完成bean之间注入。
⑶ 面向切面编程(AOP)
概念:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
实现原理:AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用 CGLIB 方式实现动态代理。AOP是一个概念,并没有设定具体语言的实现,它能克服那些只有单继承特性语言的缺点,spring2.0之后整合AspectJ第三方AOP技术。
AspectJ是一个面向切面的框架,它扩展了Java语言。AspectJ定义了AOP语法,所以它有一个专门的编译器用来生成遵守Java字节编码规范的Class文件。
主要功能:日志记录,性能统计,安全控制,事务处理,异常处理等等。
主要意图:将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
2. Spring 中的设计模式
⑴ 代理模式——spring 中两种代理方式,若目标对象实现了若干接口,spring 使用 jdk 的 java.lang.reflect.Proxy类代理。若目标兑现没有实现任何接口,spring 使用 CGLIB 库生成目标类的子类。
⑵ 单例模式——在 spring 的配置文件中设置 bean 默认为单例模式。
⑶ 模板方式模式——用来解决代码重复的问题。 比如:RestTemplate、JmsTemplate、JpaTemplate。
⑷ 前端控制器模式——spring 提供了前端控制器 DispatherServlet 来对请求进行分发。
⑸ 视图帮助(View Helper )——Spring提供了一系列的JSP标签,高效宏来辅助将分散的代码整合在视图里。
⑹ 依赖注入——贯穿于 BeanFactory/ApplacationContext 接口的核心理念。
⑺ 工厂模式——在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring 中使用 beanFactory 来创建对象的实例。
3. Spring 的常用注解
Spring 在 2.5 版本以后开始支持注解的方式来配置依赖注入。可以用注解的方式来代替 xml 中 bean 的描述。注解注入将会被容器在 XML 注入之前被处理,所以后者会覆盖掉前者对于同一个属性的处理结果。
注解装配在 spring 中默认是关闭的。所以需要在 spring 的核心配置文件中配置一下才能使用基于注解的装配模 式。配置方式如下:
常用的注解:
@Repository 用于DAO层;
@Service 用于service层;
@Controller 用于表现层;
@Required 该注解应用于设值方法;
@Autowired 该注解应用于有值设值方法、非设值方法、构造方法和变量;
@Qualifier 该注解和@Autowired 搭配使用,用于消除特定 bean 自动装配的歧义。
4. Spring bean 的生命周期
阐述Spring框架中Bean的生命周期 :
① Spring IoC容器找到关于Bean的定义并实例化该Bean。
② Spring IoC容器对Bean进行依赖注入。
③ 如果Bean实现了BeanNameAware接口,则将该Bean的id传给setBeanName方法。
④ 如果Bean实现了BeanFactoryAware接口,则将BeanFactory对象传给setBeanFactory方法。
⑤ 如果Bean实现了BeanPostProcessor接口,则调用其postProcessBeforeInitialization方法。
⑥ 如果Bean实现了InitializingBean接口,则调用其afterPropertySet方法。
⑦ 如果有和Bean关联的BeanPostProcessors对象,则这些对象的postProcessAfterInitialization方法被调用。
⑧ 当销毁Bean实例时,如果Bean实现了DisposableBean接口,则调用其destroy方法。
5. Spring Bean的实例化方式
⑴ 无参数构造
对于这种方式,注意Bean类中必须提供无参数构造。
⑶ 静态工厂方法
需要创建一个工厂类,在工厂类中提供一个static返回bean对象的方法就可以。
⑶ 实例工厂方法
需要创建一个工厂类,在工厂类中提供一个非static的创建bean对象的方法,在配置文件中需要将工厂配置,还需要配置bean。
6. Spring的作用
⑴ Spring 能帮我们根据配置文件创建及组装对象之间的依赖关系。
Spring 根据配置文件来进行创建及组装对象间依赖关系,只需要改配置文件即可。
⑵ Spring 面向切面编程能帮助我们无耦合的实现日志记录,性能统计,安全控制。
Spring 面向切面编程(AOP)能提供一种更好的方式来完成,一般通过配置方式,而且不需要在现有代 码中添加任何额外代码,现有代码专注业务逻辑。
⑶ Spring 能非常简单的帮我们管理数据库事务。
采用 Spring,我们只需获取连接,执行 SQL,其他事物相关的都交给 Spring 来管理了。
⑷ Spring 还能与第三方数据库访问框架(如 Hibernate、JPA)无缝集成,而且自己也提供了一套 JDBC访问模板,来方便数据库访问。
⑸ Spring 还能与第三方 Web(如 Struts、JSF)框架无缝集成,而且自己也提供了一套 Spring MVC框架,来方便 web 层搭建。
⑹ Spring 能方便的与 Java EE(如 Java Mail、任务调度)整合,与更多技术整合(比如缓存框架)。
7. Spring事务管理机制
⑴ Spring事务管理的四个优点:
① 提供一致的对于不同的事务管理的API;② 支持声明式事务管理(重点);③ 编程事务管理(在开发中应用比较少);④ 优秀的整合与Spring的数据访问。
⑵ Spring事务管理主要提供了三个接口来完成:
① org.springframework.transaction.PlatformTransactionManager
这是一个事务管理器,可以来选择相关的平台(jdbc hibernate jpa…)。
② TransactionDefinition
它定义事务的一些相关信息 例如 隔离 传播 超时 只读。
③ TransactionStatus
它主要描述事务具体的运行状态。
⑶ 事务管理方式
方式一:编码方案不建议使用,它具有侵入性。在原有的业务代码基础上去添加事务管理代码。
方式二:声明式事务控制,基于AOP对目标进行代理,添加around环绕通知。这种方案,它不具有侵入性,不需要修改原来的业务代码。
以下两种声明式事物管理方式:
① 基于xml配置声明式事务管理方案
第一步:在applicationContext.xml文件中添加aop与tx的名称空间。
第二步:在applicationContext.xml文件中配置,Spring提供的advice是传统的spring advice。
a. 声明事务管理器:
b. 配置通知:Spring为我们提供了一个TransactionInterceptor来完成增强
对于这个增强,我们可以使用spring为我们提供的一个标签
c. 配置切面 :因为使用的是传统的spring的advice,需要使用
② 基于annotation声明式事务管理方案
可以使用@Transaction来在类或方法上添加声明式事务管理.
注意:需要在applicationContext.xml文件中使用
相当于开启注解事务控制
问题:关于xml方式与annotation方式的优缺点?
从简单上来说,使用注解更方便。
使用配置的方案,可以对事务配置进行集中维护。
8. ApplicationContext与BeanFactory关系
ApplicationContext它是扩展BeanFactory接口。
BeanFactory它采取延迟加载的方案,只有真正在getBean时才会实例化Bean。
在开发中我们一般使用的是ApplicationContext,真正使用的是其实现类:
FileSystemXmlAppliCationContext 根据文件路径获取。
ClassPathXmlApplicationContext 根据类路径获取。
AppliCationContext它会在配置文件加载时,就会初始化Bean,并且ApplicationContext它提供不同的应用层的Context实现。例如在web开发中可以使用WebApplicationContext。