Spring - XinxinZhou/JavaEE GitHub Wiki
Spring 容器 包括: 基于依赖注入的核心机制,基于AOP的声明式事务管理,与多种持久层技术的整合,以及优秀的WebMVC框架等。 Spring致力于解决JAVA EE各层的解决方案,而不是仅仅专注于某一层。
Spring可以贯穿表现层,业务层,持久层。 但是Spring不想取代那些框架,而是以高度的开放性与它们整合。
工厂设计模式,表达出Spring的思想?
Spring Core Container?
Spring,无需直接创建类的实例,而是通过Spring容器获取类的实例。(类似工厂模式) Spring容器根据配置文件信息,负责创建对象的实例,并为对象实例设置属性值.---这种由Spring容器为对象设置属性的方式被称为控制反转(Inversion of Control, IOC).
Spring 的核心机制:依赖注入 Spring通过配置文件为对象属性赋值,称之为注入。 如果A对象调用了B对象的方法,我们可以称A对象依赖于B对象。 所以Spring容器为Bean注入属性,称之为依赖注入。 而且,Spring还能为Bean注入其他Bean的引用。(为某个java对象实例提供其他需要的java实例).
控制反转与依赖注入,含义相同: 当某个java实例需要另外一个java实例,在传统的程序设计过程中,通常由某个调用者来创建被调用者的实例。 而在依赖注入的模式下,创建被调用者的工作不再由调用者来完成,因此称为控制反转; 创建被调用者实例的工作通常是由Spring容器来完成,然后注入调用者,因此也称为依赖注入。
案例:人需要一把斧子. 1.调用者直接使用new关键字创建被调用的java实例,高耦合,效率低下。 2.面向接口编程,调用者只需找到符合某种标准(接口)的实例,即可使用。此时,调用的代码面向接口编程,可以让调用者和被调用者解耦,但是调用者依然需要主动定位工厂,与工厂耦合。 3. 调用者无需理会被调用者的实现,也无须定位工厂,这是最好的解耦方式。
Spring 强调面向接口编程. 采用setter方法为目标bean注入所以来的Bean,这种方式称为设值注入。
还有一种方式是通过构造函数来设置依赖关系,称为构造注入.
一般以设值注入为主,构造注入为辅, 在依赖关系无须变化的注入,尽量采用构造注入。
Spring 的关键就是配置文件 xml。 7.5.9 组合属性只有最后一个属性才是调用setter方法,前面各个属性实际上对应于调用getter方法. 所以前面的属性都不能是null. eg: 对应: a.getFoo().getBar().getX().setY("xx");
组件和组件之间的耦合,采用依赖注入管理,但是普通的javaBean属性值,应直接在代码中设置。
8.1.2 Bean 后处理器的用处 (其实就是对定义好的Bean做自定义操作) BeanNameAutoProxyCreator:根据Bean实例的name属性,创建Bean实例的代理。 DefaultAdvisorAutoProxyCreator: 根据提供的Advisor,对容器所有的Bean实例创建代理。 用于根据容器配置的拦截器,创建代理Bean, 代理Bean就是对目标Bean进行增强,在目标Bean的基础上进行修改得到新的bean。 *如果需要对容器中某一批Bean进行通用的增强处理,则可以考虑使用Bean后处理器。
8.1.3 容器 后处理器 容器后处理器负责处理容器本身 必须实现BeanFactoryPostProcessor接口,(必须实现postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory)). 若在代码中使用ApplicationContext作为Spring容器,那么该Spring容器会自动搜索容器中所有实现了BeanPostProcessor接口的类,并将它注册成容器后处理器;(不用自己在xml里配置).
PropertyPlaceholderConfigurer 后处理器,负责读取Properties属性文件里的属性值,并将这些属性值设置成Spring配置文件的元素据 (比如数据库.properties),可以将数据库连接信息从Spring配置文件中分离,Spring容器可以从properties文件读取需要的信息。
8.2. Spring零配置. 摒弃配置,使用Annotation来标注Bean类: @Component: 普通的Spring Bean类 @Controller: 控制器组件类 @Service: 标注一个业务逻辑组件 @Repository: 标记一个DAO组件类. 但是仍然需要一个配置文件xml. 通过语句: <context:component-scan base-package = "org.xx.package"/> 扫描制定包下所有的bean.