`

Spring自动扫描和管理Bean

阅读更多

         在前面使用注解的时候,除了<beans>结点配置增加了名称空间说明,另还增加了<context:annotation-config/>配置,它的作用就是隐式注册了多个对注释进行解析的处理器。通常情况下,我们要使用某个bean实例,总会配置<bean>相关内容。Spring2.5为我们引入了自动扫描机制,他可以在类路径底下寻找标注了@Component、@Service、@Controller、@Repository注解的类,并把这些类纳入进spring容器中管理,它的作用和在xml文件中使用bean节点配置是一样的.我们只要在配置文件作如下设置:<context:component-scan base-package="包名"/>便可以自动管理指定包名及子包下标住了@Service用于标注业务层组件、@Controller用于标注控制层组件(如struts中的action)、@Repository用于标注数据访问组件,即DAO组件。而@Component泛指组件(当组件不好归类的时候,我们可以用这个注解进行标注)的类,并把它们作一个实例bean,相当于在beans.xml中配置了<bean>元素。需要说明的是,使用了此配置同时意味着还注册了注解配置的处理器,所以在这些类中用到了注解配置时并不需要再配置<context:annotation-config/>。
       为什么提出自动扫描管理:在一些比较大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,不但配置内容繁琐,而且显然会增加配置文件的体积,查找及维护起来也不太方便。因此spring提出了自动扫描bean,它依据在xml文件中指定的包名和类中标记的component系列注解。

实例讲解

1.配置文件与上一节中的配置文件很相似,由于<context:component-scan base-package="包名"/>注册的对注释的处理器包含了<context:annotation-config/>语句注册的处理器,所以这句话可以省略了:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans  
	http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/context           
  http://www.springframework.org/schema/context/spring-context-2.5.xsd">
  <context:component-scan base-package="com.reiyenkart"/> <!--其中base-package为需要扫描的包(含子包)-->
</beans>

 2.java代码实例

2.1 组件默认注册代码如下所示:

@Service
public class PersonServiceBean{
}

 在Spring容器中获取此组件:

PersonService personService = (PersonService)ctx.getBean(“personServiceBean”)

 注意:如果使用Service这些注解时不指定名称,这些实例bean的名称就是类名(但首字母小写)。

2.2 注册组件时指定名称,代码如下:

@Service(“personService”) //指定调用时的名称,
 public class PersonServiceBean{
}

  在Spring容器中获取此组件:

PersonService personService = (PersonService)ctx.getBean(“personService”)

 2.3 使用注解@Scope配置bean的作用范围

@Service("personService") @Scope("pototype")
 public class PersonServiceBean{
}

 测试代码:

PersonService personService = (PersonService)ctx.getBean("personService")
PersonService personService1= (PersonService)ctx.getBean("personService")
System.out.println(personService == personService1);

 输出结果为false,说明此组件是作用域prototype的。

2.4 @PostConstruct注解指定bean的init方法

@PostConstruct //使用注解指定bean的初始化方法,这个注解不是Spring的注解,而是EJB3的
public void init(){
}

 2.5 @PreDestory注解指定bean的destory方法

@PreDestory //使用注解指定bean的destory方法
public void destroy(){}

  总结:@Scope对应于xml配置文件的scope属性
        @PostConstruct对应于xml配置文件中的init-method属性
        @PreDestroy对于应于xml配置文件中的destroy-method属性

部分注解对应的类如下:

1、@Autowired        org.springframework.beans.factory.annotation.Autowired;
2、@Qualifier        org.springframework.beans.factory.annotation.Qualifier;
3、@Componet        org.springframework.stereotype.Component;
4、@Resource        javax.annotation.Resource;
5、@Scope        org.springframework.context.annotation.Scope;
6、@PostConstruct    javax.annotation.PreDestroy;
7、@PreDestroy        javax.annotation.PreDestroy;
一个完整的实例:

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.annotation.Resource;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component(value="userService")
@Scope("singleton")
public class UserService {
	@PostConstruct 
	public void init(){System.out.println("现在开始初始化UserService");}	
	private UserDao userDao = new UserDaoImpl();
	public UserDao getUserDao() {return userDao;}
	@Resource
	public void setUserDao(UserDao userDao) {this.userDao = userDao;}
	public void add(User u){	userDao.save(u);}
	@PreDestroy
	public void destroy(){System.out.println("destory");	}
 

 

 

 

 

分享到:
评论
2 楼 YSOLA4 2012-11-11  
请教一下,你的ctx是什么啊?
1 楼 dengjie200 2010-10-11  
为什么我注解定义的BEAN就用CTX获取不到呢?????????????根本不在BeanDefinitionNames里面

相关推荐

    spring自动扫描和管理Bean的示例

    通过分析这个示例,你可以更好地理解Spring自动扫描和管理Bean的工作原理,以及如何在实际项目中应用这些概念。 总结起来,Spring的自动扫描和管理Bean功能是通过组件扫描和注解驱动配置实现的,这大大减少了手动...

    Spring学习笔记(9)----让Spring自动扫描和管理Bean

    Spring自动扫描的Bean同样遵循Spring的生命周期管理。这包括初始化方法、销毁方法、以及基于回调的生命周期处理。例如,你可以使用`@PostConstruct`和`@PreDestroy`注解来标识初始化和销毁方法。 ### **其他注解** ...

    Spring自动扫描无法扫描jar包中bean的解决方法

    在Spring框架中,自动扫描(Auto-Component Discovery)是一个便捷的功能,它允许开发者无需显式配置每个Bean,而是通过指定包名让Spring自动发现并管理Bean。然而,当Bean定义在独立的jar包中,有时Spring可能无法...

    spring 2.5 IOC 自动扫描,自动注入

    在Spring框架中,IOC(Inversion of Control,控制反转)是一种设计模式,它将对象的创建和管理交给了框架,从而让开发者更专注于业务逻辑。而自动扫描和自动注入是Spring 2.5中实现IOC的两个核心特性,极大地简化了...

    Spring通过在classpath自动扫描方式把组件纳入spring容器中管理

    Spring自动扫描机制主要涉及以下几个关键概念: 1. **@Component**: 这是最基本的组件注解,可以标记在任何业务逻辑类上。Spring会将这些类视为bean并纳入管理。如果你需要更具体地表示某种类型的组件,可以使用它...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    这是Spring提供的接口,用于获取bean和管理bean的生命周期。你可以通过实现ApplicationContextAware接口,或者直接在代码中创建ApplicationContext实例来访问bean。 5. **非Spring管理类调用bean**: 在非Spring...

    Spring定义bean的三种方式和自动注入

    在Spring框架中,管理Bean的方式主要有三种:XML...总之,Spring提供了多种方式来定义和管理Bean,从XML到注解再到Java配置,使得开发更加灵活高效。同时,自动注入功能大大简化了依赖关系的建立,降低了代码耦合度。

    Spring mvc portlet demo

    - 注解配置:通过在类上使用`@Component`,方法上使用`@Autowired`等注解,让Spring自动扫描和管理bean。 **sample_BookCatalog** 这个文件可能是一个示例的书目目录portlet,它展示了如何在Spring MVC Portlet中...

    spring入门

    这些注解帮助Spring自动扫描和管理bean。 4. **注解驱动开发(Annotation-based Development)**:随着Spring的发展,越来越多的功能可以通过注解实现,减少了XML配置的需求。例如,@Autowired用于自动装配bean的...

    Spring2.5 自动扫描classpath

    5. **Spring_demo_03_autowire** - 自动装配(Autowiring)是Spring自动扫描classpath的核心特性,它能根据类型或名称自动为bean注入依赖。 6. **Spring_demo_08_autowired_qualifier** - @Autowired注解配合@...

    spring bean life cycle

    `@Component`注解的类会自动被Spring扫描并注册为Bean,而`@Configuration`类则提供了更高级别的配置方式,可以替代XML配置文件。 此外,Spring提供了一种名为BeanPostProcessor的接口,它允许我们自定义Bean实例化...

    Spring的自动扫描注入.docx

    在 Spring 2.5 中,引入了组件自动扫描机制,该机制可以在类路径下寻找标注了 @Component、@Service、@Controller、@Repository 注解的类,并将这些类纳入 Spring 容器中管理。 @Component、@Repository、@Service...

    spring管理bean应用实例代码

    在Spring框架中,Bean管理是核心功能之一,它允许开发者通过声明式的方式配置和管理对象。这个压缩包文件“spring管理bean应用实例代码”显然包含了关于如何在Spring中配置和使用Bean的示例代码。接下来,我们将深入...

    ssm跳转简易项目000000

    在项目中,我们可能能看到XML配置文件(如applicationContext.xml),用于定义bean及其依赖关系,或者看到基于注解的配置,如@Service、@Repository、@Controller等,这些注解帮助Spring自动扫描和管理bean。...

    spring自动扫描

    Spring 自动扫描是一种简化 Spring 应用程序上下文配置的方式,它允许开发者通过注解而不是 XML 配置文件来声明组件。Spring 2.5 引入了这项功能,极大地提高了开发效率,使得代码更加简洁且易于维护。下面将详细...

    spring3零配置注解实现Bean定义

    4. 为了启用自动扫描和注册Bean定义,需要在Spring配置文件中使用`&lt;context:component-scan&gt;`标签,并通过`base-package`属性来指定需要扫描的类路径位置。 5. 在配置文件中还可以通过`&lt;aop:aspectj-autoproxy/&gt;`...

    Spring中与Bean相关的接口

    它是Spring中最基本的Bean容器,负责创建、配置和管理Bean。`BeanFactory`提供了一个延迟初始化Bean的能力,这意味着Bean只在真正被请求时才会被实例化,这有助于提高应用的启动速度。例如,当使用`XmlBeanFactory`...

    spring包扫描配置的项目

    在Spring框架中,包扫描(Package Scanning)是一项核心功能,它允许我们在应用程序上下文中自动检测和注册bean定义。这个过程极大地简化了依赖注入和组件配置。本项目以"spring包扫描配置"为主题,旨在通过一个简单...

    spring注解开发--Bean加载控制.zip

    在Spring框架中,注解开发已经成为了主流,极大地简化了配置和bean的管理。本教程主要探讨的是如何在Spring中通过注解来控制Bean的加载,以实现更加灵活的依赖注入和应用程序控制。我们将深入理解以下几个核心概念:...

Global site tag (gtag.js) - Google Analytics