Spring的Bean类?

Spring Bean是事物处理组件类和实体类(POJO)对象的总称,Spring Bean被Spring IOC容器初始化,装配和管理。在Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期以及作用域等信息。

Bean类的配置项

Spring IOC容器管理Bean时,需要了解Bean的类名、名称、依赖项、属性、生命周期及作用域等信息。为此,Spring IOC提供了一系列配置项,用于Bean在IOC容器中的定义。

1、class:该配置项是强制项,用于指定创建Bean实例的Bean类的路径。

比如以下配置中。class=org.springframework.scheduling.quartz.SchedulerFactoryBean,则表示Bean类的路径。

2、name:该配置项是强制项,用于指定Bean唯一的标识符,在基于 XML 的配置项中,可以使用 id和或 name 属性来指定 Bean唯一 标识符。

3、scope: 该配置项是可选项,用于设定创建Bean对象的作用域。

4、constructor-arg:该配置项是可选项,用于指定通过构造函数注入依赖数据到Bean。
如:

	<bean id="connectionManager"
		class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
		<property name="params" ref="connectionManagerParams" />
	</bean>
	<bean id="httpClient" class="org.apache.commons.httpclient.HttpClient">
		<constructor-arg>
			<ref bean="connectionManager" />
		</constructor-arg>
	</bean>

5、properties:该配置项是可选项,用于指定通过set方法注入依赖数据到Bean。

6、 autowiring mode:该配置项是可选项,用于指定通过自动依赖方法注入依赖数据到Bean。

7、lazy-initialization mode:该配置项是可选项,用于指定IOC容器延迟创建Bean,在用户请求时创建Bean,而不要在启动时就创建Bean。

8、initialization:该配置项是可选项,用于指定IOC容器完成Bean必要的创建后,调用Bean类提供的回调方法对Bean实例进一步处理。

spring中bean的配置

三种方法:

1、基于XML的配置;

2、基于注解的配置;

3、基于Java的配置。

基于XML的配置

项目创建后,需要手动创建Spring配置文件,Spring配置文件默认名称是applicationContext.xml,也可以用其他文件名称代替。
(1)Spring配置文件的加载

xml是Spring最常见的配置源。加载Spring的配置文件有多种方式。Spring中的几种容器都支持使用xml装配bean,比如:


XmlBeanFactory:引用资源
ClassPathXmlApplicationContext: 编译路径,使用ClassPathXmlApplicationContext对象获取,必须把applicationContext.xml放置到类的加载路径中
FileSystemXmlApplicationContext:文件系统路径
XmlWebApplicationContext是专为Web工程定制的

还有一种情况是在web应用中,通过ContextLoaderListener可加载多个配置文件,在web.xml中利用<context-param>元数来指定多个配置文件位置。

  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
      classpath:applicationContext.xml
      classpath:dubbo.xml
    </param-value>
  </context-param>

(2)xml中定义bean

如:

​
	<bean id="scheduler"
		  class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
		  destroy-method="destroy">
		<property name="triggers">
			<list>
				<ref bean="MysqlIoTrigger" />
				<ref bean="MysqlSqlTrigger" />
			</list>
		</property>

​

<bean>标签用于定义Bean,各属性说明如下:

① id:Bean的唯一标识,ApplicationContext对象可以通过id获取该Bean的实例。

② calss:Bean类的存储路径。

<property>标签用于从外部注入Bean的属性值, <property>标签各属性说明如下:

① name:Bean类的属性名称。

② value:name所值属性的值。

基于注解的配置

从 Spring 2.5 开始就可以使用注解来配置依赖注入。使用注解的方式使我们无需在XML中配置一个Bean引用,更加简单和方便。

注解配置默认情况下在Spring中是关闭的,我们需要在配置文件中使用<context:annotation-config/>激活它。另,在我们使用注解时一般都会配置扫描包路径选项:如:<context:component-scan base-package="pack.pack"/>,该配置项其实包含了<context:annotation-config/> 的功能,因此当使用<context:component-scan/>后,即可将<context:annotation-config/>省去。
如:

import org.springframework.stereotype.Component;

@Component("userDao")
public class UserDao {
    ...
}

使用 @Component 注解在 UserDao 类声明处对类进行标注,它可以被 Spring 容器识别,Spring 容器自动将 POJO 转换为容器管理的 Bean。它和以下 XML 配置是等效的:

<bean id="userDao" class="com.smart.anno.UserDao"/>

除  @Component 外,Spring还提供了3个功能基本和 @Component 等效的注解,分别用于对 DAO、Service及 Web 层的 Controller 进行注解。

@Repository:用于对 DAO 实现类进行标注。
@Service:用于对 Service 实现类进行标注。
@Controller:用于对 Controller 实现类进行标注。

之所以要在 @Component 之外提供这3个特殊的注解,是为了让标注类本身的用途清晰化,完全可以用 @Component 替代这3个特殊的注解。但是,我们推荐使用特定的注解标注特定的 Bean,毕竟这样一眼就可以看出 Bean 的真实身份。当Bean的实现类是当前项目开发的,可以直接在Java类中使用基于注解的配置,配置比较简单。

加载bean:

        ApplicationContext context = new ClassPathXmlApplicationContext(
            "applicationContext.xml");
        UserDao userDao= (UserDao) context.getBean("userDao");

通过为bean添加注解实现自动装配

创建应用对象之间的协作关系的行为称为装配(writing),这是依赖注入的本质。如果所有的对象都是独立的,彼此之间没有任何依赖,那么使用组件扫描就能自动化装配bean。但是实际工作中,很多对象会依赖其他对象完成任务。这时候就需要能够将组件扫描得到的bean和他们依赖装配在一起。这就是自动装配(autowiring)。
Spring中使用@Autowired注解来实现Bean的依赖注入。

如:

//①定义一个 Service 的 Bean
@Service
public class LogonService implements BeanNameAware {
    //②分别注入logDao和userDao的Bean
    @Autowired
    private LogDao logDao;

    @Autowired
    private UserDao userDao;
}

在①处使用 @Service 将 LogonService 标注为一个 Bean,在②处通过 @Autowired 注入 LogDao 及 UserDao 的 Bean。@Autowired 默认按类型(byType)匹配的方式在容器中查找匹配的 Bean,当有且仅有一个匹配的 Bean 时,Spring 将其注入 @Autowired 标注的变量中。

1)如果容器中没有一个和标注变量类型匹配的 Bean,那么 Spring 容器启动时将报 NoSuchBeanDefinitionException 异常。如果希望 Spring 即使找不到匹配的 Bean 完成注入也不要抛出异常,那么可以使用 @Autowired(required=false) 进行标注。在默认情况下,@Autowired 的 required 属性值为 ture,即要求必须找到匹配的 Bean,否则将报异常。

2)使用 @Qualifier 指定注入 Bean 的名称:如果容器中有一个以上匹配的 Bean时,则可以通过 @Qualifier 注解限定 Bean 的名称,如下所示。

 

基于java类的配置

定义一个配置类,用@Configuration注解该类,等价于XML里的<beans>,用@Bean注解方法,等价于XML配置的<bean>,方法名等于beanId。方法必须提供Bean的实例化逻辑。

@Configuration
public class SpringConfig {
    @Bean
    public Service service(){
        return new Service();
    }
    @Bean
    public Client client(){
        return new Client();
    }
}

加载bean:

 ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);
 Client client = context.getBean("client",Client.class);

Spring Bean的这三种配置方式,因为XML配置较为繁琐,现在大部分开始用注解和java配置,一般什么时候用注解或者java配置呢?

基本原则是:全局配置用java配置(如数据库配置,MVC,redis等相关配置),业务Bean的配置用注解(@Service @Component@Repository@Controlle)。

Bean作用范围及生命过程方法

通过注解配置的 Bean 和通过 <bean> 配置的 Bean 一样,默认的作用范围都是 singleton。Spring 为注解配置提供了一个 @Scope 注解,可以通过它显式指定 Bean 的作用范围。

在使用 <bean> 进行配置时,可以通过 init-method 和 destory-method 属性指定 Bean 的初始化及容器销毁前执行的方法。Spring 从2.5开始支持 JSR-250 中定义的 @PostConstruct 和  @PreDestroy 注解,在 Spring 中它们相当于 init-method 和 destory-method 属性的功能,不过在使用注解时,可以在一个 Bean 中定义多个 @PostConstruct 和 @PreDestroy 方法。

 


版权声明:本文为qq_35462323原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。