1.Spring简介
Spring的根本使命:简化Java开发,为了降低Java开发的复杂性,Spring采取了以下四种关键策略:
- 基于POJO的轻量级和最小侵入性变成
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
依赖注入
通过DI对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,对象无须自行创建或管理它们的依赖关系。
依赖注入方式
- 构造器注入
- setter函数注入
- 注解注入
应用上下文
Spring通过应用上下文装载bean的定义并把它们组装起来,Spring应用上下文全权负责对象的创建和组装。
- 对基于xml的配置,Spring提供了ClassPathXmlApplicationContext应用上下文
- 对基于java的配置,Spring提供了AnnotationConfigApplicationContext应用上下文
2.装配
创建应用组件之间协作的行为称为装配,装配方式有
- 基于xml的配置
- 基于 java的配置
- 隐式的bean发现机制和自动装配
原则: 尽可能地使用自动装配的机制,显式配置越少越好
2.1 通过java代码装配bean
2.1.1 创建配置类
@Configuration注解表明这个类是一个配置类,该类应该包含在应用上下文中如何创建bean的细节。
2.1.2 声明简单的bean
要在JavaConfig中声明bean,我们需要编写一个方法,这个方法会创建所需类型的实例,然后给这个方法添加@Bean。
@Bean注解会告诉Spring这个方法将会返回一个对象,该对象要注册为Spring应用上下文中的bean,方法体中包含了最终产生bean实例的逻辑。默认情况下,bean的ID与带有@Bean注解的方法名是一样的。
2.1.3 借助JavaConfig实现注入
通常采用构造器和Setter方法将所需要的bean注入进来。当然你也可以使用其他任何方法,只要添加@Bean注解,并把需要的bean对象注入进来即可。
默认情况下,Spring中的bean都是单例的。
2.2 通过xml装配bean
2.2.1 创建xml配置规范
2.2.2 声明一个简单的<bean>
<bean id="..." class="..." scope="singleton">
<!-- collaborators and configuration for this bean go here -->
</bean>
2.2.3 借助构造器注入初始化bean
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<constructor-arg ref="spellChecker"/>
<constructor-arg value="Zara"/>
</bean>
如果你想要向一个对象传递一个引用,你需要使用 标签的 ref 属性,如果你想要直接传递值,那么你应该使用如上所示的 value 属性。
也可以采用c-命名空间简化配置。
2.2.3 设置属性
<bean id="textEditor" class="com.tutorialspoint.TextEditor">
<property name="spellChecker" ref="spellChecker"/>
</bean>
也可以采用p-命名空间简化配置。
2.3 自动化装配
Spring从两个角度来实现自动化装配:
- 组件扫描:spring会自动发现上下文中所创建的bean
- 自动装配:spring自动满足bean之间的依赖
组件扫描
- @Component:注解在类上面,表明该类会作为组件类,并告知spring要为这个类创建bean
- @ComponentScan("backageName"):启用组件扫描,注解在配置类上面,spring会自动扫描该类所在的包以及这个包下的所有子包,查找带有@Component注解的类,也可以通过在xml文件中增加<context:componet-scan>元素启用组件扫描。
如果只有@ComponentScan,而没有设置属性,它会以配置类所在所在的包作为基础包,如果想自定义不同的基础包,可以在()中进行定义。如下所示:
@ComponentScan(basePackages={"packageName1","packageName2"})
@ComponentScan还提供了另外一种方法,将其指定为包中所包含的类或接口
@ComponentScan(basePackageClasses=({className1.class,className2.class}),basePackageClasses所设置的数组中包含了类,这些类所在的包将会作为组件扫描的基础包。
自动装配
@Autowired注解,可以作用在构造器上,Setter方法,普通方法上。
令狐.jpg
网友评论