Spring框架概念
Spring的两个重要概念。IoC(Inversion of Control)控制反转、AOP(Aspect Oriented Programming)面向切面编程
IoC:
IoC是一个容器,在Spring中,Java一切的资源都是JavaBean。Spring管理着这些JavaBean,包括JavaBean的创建、事件、行为等,它们由IoC容器管理。
JavaBean之间存在着一定依赖关系,如:班级是依赖于老师与学生组成,老师与学生都是JavaBean,就形成依赖。
主动创建的模式,责任在于开发者,而在被动情况下,责任在于Ioc容器,基于这样的被动形式,我们就说对象被控制反转了。(由开发者,变为IoC容器)
控制反转:是面向对象编程中的一种设计模式,可以用来减少计算机代码之间的耦合度,最常见的方式叫做依赖注入,还有一种方式叫依赖查找用过控制反转,对象在创建的时候,由一个调控系统,对象在创建的时候,由用过调控系统内所有对象的外界实体,将其所依赖的对象引用传递它。可以说,依赖被注入对象。
例子:
现在有3个类:Fruit、Apple、Banana
依照向上转型规则:
Fruit f = new Apple();
user.eat(f);
这个方法是一个弊端,当我们不吃Apple时,改吃香蕉的时候,需要去修改源码。Spring IoC容器能解决这个问题,通过配置XML依照自己的需求去寻找Banana。
<bean id = "fruit" class="Apple"/>
<bean id="user" class = "xxx.User">
<property name="fruit" ref="fruit"/>
</bean>
只需通过修改XML配置,就能将Apple切换为Banana
<bean id="fruit" class="Banana">
就完成了Apple与Banana替换工作了。
在Spring IoC容器中,只需向容器表达所需要的资源,Spring IoC就可以自动帮你找到所需的资源,这个就是Spring Ioc的理念。
Spring容器最底层接口BeanFactory,通常使用的ApplicationContext接口是BeanFactory的一个子接口。
BeanFactory位于设计的最底层,它提供了Spring IoC最底层的设计。
Object getBean(String name) throws BeansException;
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
Object getBean(String name, Object... args) throws BeansException;
<T> T getBean(Class<T> requiredType) throws BeansException;
boolean containsBean(String name);
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
getBean的多个方法用于获取配置给Spring IoC容器的Bean。从参数类型来看可以是字符串,也可以是Class类型,由于Class类型可以扩展接口也可以继承父类,使用在一定程度上会存在使用父类类型无法准确获得准确的实例的异常。
isSingleton用户判断是否单例,如果判断为真,其意识是该Bean在容器中作为唯一一个单例存在。而isPrototype则相反,判断为真,意识是当你从容器中获取一个Bean,容器默认生成一个新的实例。在默认的情况下,Spring会为Bean创建一个单例,也就是isSingleton默认值为True,Spring默认使用单例模式。
getType获取类型,根据字符串匹配Java类型
getAliases获取别名
ClassPathResource resource = new ClassPathResource("spring.xml");
//以Resource对象作为参数创建BeanFactory实例
XmlBeanFactory factory = new XmlBeanFactory(resource);
ApplicationContext context = new ClassPathXmlApplicayionContext("Spring.xml");
//获得对象
context.getBean(Bean.class);
IoC容器的基本接口是由BeanFactory来定义的,也就是说BeanFactory定义了Ioc容器的最基本的形式,并且提供了IoC容器所应该遵守的最基本的契约。
BeanFactory源码:
public interface BeanFactory {
String FACTORY_BEAN_PREFIX = "&";
Object getBean(String var1) throws BeansException;
<T> T getBean(String var1, @Nullable Class<T> var2) throws BeansException;
Object getBean(String var1, Object... var2) throws BeansException;
<T> T getBean(Class<T> var1) throws BeansException;
<T> T getBean(Class<T> var1, Object... var2) throws BeansException;
boolean containsBean(String var1);
boolean isSingleton(String var1) throws NoSuchBeanDefinitionException;
boolean isPrototype(String var1) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, ResolvableType var2) throws NoSuchBeanDefinitionException;
boolean isTypeMatch(String var1, @Nullable Class<?> var2) throws NoSuchBeanDefinitionException;
@Nullable
Class<?> getType(String var1) throws NoSuchBeanDefinitionException;
String[] getAliases(String var1);
}
AOP:
核心的概念:
连接点:连接点是应用程序执行期间明确定义的一个点,连接点的典型事例包括方法调用、方法调用本身、类初始化和对象实例化。连接点是AOP的核心概念,并且定义了在应用程序中可以使用AOP插入其他逻辑的点。
通知:在特定连接点执行的代码就是通知,它是由类中的方法定义的。有许多类型的通知,比如前置通知(在连接点之前执行)和后置通知(连接点之后执行)。
切入点:切入点是用于定义合适执行通知的连接点集合。通过创建切入点,可以更
IoC的目标就是为了管理Bean,而Bean是Java面向对象(OOP)的基础设计。
但是有些情况下,面向对象的设计是无法处理的。一个学生想请假,先向辅导员请假,辅导员再上报给院系。请假条通过辅导员,但是没有通过院系。院系不批准请假条,影响了这个学生,也影响辅导员,辅导员也许更改转态。
Spring AOP常用于数据库事务的编程,做完第一步数据库更新后,不知道下一步的情况,下一步要是失败,使用数据库的事务回滚功能区回滚事务,使第一步操作失效。在Spring AOP实现的数据库事务管理中,是以异常作为更新的。在默认情况下,只要Spring接受到了异常信息,就进行事务的回滚功能,保证数据的一致性。
private void proceed(Leave leave){
//请假条是否通过
boolean flag = instructor.isPass(leave);
if(flag){ //请假条通过院系批准
if(financialDept.isOVerBudget(leave) { //系院不批准
//抛出异常,回滚
throw new RuntimeException("失败");
}
}
这里完全看不到数据库代码,也没有复杂的try…catch…finally…语句。在现实中,Spring AOP的编程也是这样如此,这些东西被Spring屏蔽了,不需要关注它,只需要关注业务代码,知道只要发生异常,Spring会回滚事务就够了。
Spring Ioc承担了一个资源管理、整合、即插即拔的功能
Spring AOP可以提供切面管理,特别是数据库事务管理功能