1.基于XML配置的扩展
从Spring2.0开始,Spring提供了XML Schema可扩展机制,用户可以自定义XML Schema文件,并自定义XML Bean解析器,并集成到Spring IoC容器中。
不管是bean的定义,还是Spring自身的配置,早期都是通过xml配置完成的。
1.定义schema(xsd)
要支持XML的配置方式,首先需要定义一套XML Schema来描述组件所提供的功能。
2.创建NamespaceHandler(实现NamespaceHandler接口)
除了XMLSchema,我们还需要创建一个自定义的NamespaceHandler来负责解析用户在XML中的配置,
(1)继承NamespaceHandlerSupport
为了简化代码,我们一般都会继承一这个类,然后在init方法中注册处理我们自定义节点的BeanDefinitionParser。
(2)自定义BeanDefinitionParser(实现BeanDefinitionParser接口,可多个)
2.基于Java配置的扩展
从Spring3.0开始,@Configuration用于定义配置类,可替换xml配置文件,被注解的类内部包含一个或多个被@Bean注解的方法,这些方法将会被AnnotationConfigApplicationContext或AnnotationConfigWebApplicationContext类进行扫描,并用于构造bean定义,初始化spring容器。
1.@Import注解
支持Java配置扩展的关键点就是@Import注解,Spring 3.0提供了这个注解用来支持在Configuration类中引入其它的配置类,包括Configuration类,ImportSelector和ImportBeanDefinitionRegistrar的实现类。
我们可以通过这个注解来引入自定义的扩展Bean。
2.自定义注解
这里的关键点是在注解上使用@Import ,从而Spring在处理自定义注解时会实例化并调用@Import引入的类对应的方法。
3.Bean的自动装配
Bean的主动装配和配置属性可以使用@Autowired
注解来实现。
- 自动装配(Autowire):
@Autowired
: 可以用于构造方法、setter方法和成员变量上,根据类型进行自动装配@Autowired注解可以在构造方法、setter方法或成员变量上使用。当Spring容器需要注入依赖时,它会查找匹配的Bean,并将其自动装配到相应的位置。.配置属性:-
@Value: 用于注入简单的属性值。
@Component
public class UserService {
@Value("${app.name}")
private String appName;
// ...
}
Bean的主动装配有几种常用的设置方式:
按名称装配(byName):
在XML配置中,使用autowire="byName"来设置按照Bean的名称进行装配。
在注解配置中,结合@Autowired和@Qualifier注解来指定具体的Bean名称。
按类型装配(byType):在XML配置中,使用autowire="byType"来设置按照Bean的类型进行装配。
在注解配置中,使用@Autowired注解来按照类型进行自动装配。
构造器注入(constructor):在XML配置中,使用构造器注入的方式来进行装配。通过<constructor-arg>元素指定构造器参数对应的Bean。
在注解配置中,使用@Autowired注解在构造方法上进行装配。4.Bean的作用域
在Spring中,Bean的作用域定义了Bean实例的生命周期和可见范围。Spring框架提供了以下常见的Bean作用域:
单例(Singleton):
默认的作用域,即一个Bean定义对应一个唯一的实例。
在整个应用程序中,无论何时请求该Bean,都返回同一个实例。
原型(Prototype):每次请求Bean时,容器都会创建一个新的实例。
每次注入或获取Bean时,都会返回一个新的实例。
会话(Session):在Web应用中有效,每个会话(session)对应一个Bean实例。
每个用户会话拥有独立的Bean实例。
请求(Request):在Web应用中有效,每个请求(request)对应一个Bean实例。
每个请求拥有独立的Bean实例。全局会话(Global Session):
仅在基于Portlet的Web应用中有效,每个全局会话对应一个Bean实例。
自定义作用域:Spring还允许自定义作用域。
可以通过实现org.springframework.beans.factory.config.Scope接口来自定义作用域。