今天学习spring的bean组件装载功能,个人不太喜欢xml文件一个个配置bean的方式,所以主要学习测试注解式的自动装载方式。下面将简单说明下@Component的用法,简单入门示例献给大家。

  实现主要步骤说明:

1、ApplicationContext.xml(spring上下文环境配置)文件先配置好需要自动扫描的包位置。注册完成后,在spring初始化上下文环境时,会自动扫描声明的包以及子包下面有注解(@Component,@Repository,@Service,@Controller)的类型,并缓存起来。这里需要提一下@Component是一个基础的注解,不对代码功能分类进行区分,@Repository一般用于业务逻辑层的类注解,@Service用于dao层注解,@Controller用于控制器注解。

<?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.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- 定义 bean 的 id,以及对应的 java 类 -->
<context:component-scan base-package="com.spring.simm" use-default-filters="true"/>
<!--<bean id="helloWorld" class="com.spring.simm.impls.HelloWorld">
<property name="message" value="Hello World!" />
</bean>-->
</beans>

2、添加一个HelloWorld组件。需要注意的是@Component注解的组件,默认都是单例模式,即缺省的@Scope("singleton")。通过spring去getBean实例时,其实都是同一个对象。我这里将改组件设置成多例模式,即添加注解@Scope("prototype")。

@Scope的模式有:singleton、prototype、request、session、global session,其他模式各位可以查阅网上资料

public interface IHelloWorld {
void say(String name);
}
@Scope("prototype")
//@Scope("singleton")
@Component("hello")
public class HelloWorld implements IHelloWorld {
private static int no = 0;
public HelloWorld(){
no++;
System.out.println("IHelloWorld[" + no +"]运行");
}
/**
* 说话
*/
public void say(String name) {
// TODO Auto-generated method stub
System.out.println(name +" : hello world!");
}
}

3、再添加一个HelloWorldService组件,注解成@Service,单例模式(后面,我们针对单例、多例两个组件的表现进行测试)。在服务内声明了一个自动装载的HelloWorld组件(@AutoWired),通过getHelloWorld方法返回,由于服务类是单例模式,因此这个helloworld对象也是唯一的,在服务的整个生命周期中不变。getHelloWorld2方法则每次都创建一个新的HelloWorld对象。

public interface IHelloWorldService {
HelloWorld getHelloWorld();
HelloWorld getHelloWorld2();
}
/**
* Hello world 服务,默认情况下就是单例的
* @author wh-simm
*
*/
@Service("helloservice")
public class HelloWorldService implements IHelloWorldService {
private static int no = 0;
public HelloWorldService(){
no++;
System.out.println("HelloWorldService["+no+"]启动");
}
/**
* 自动装载
*/
@Autowired
private HelloWorld helloWorld;
/**
* 获取自动装载的实例
*/
public HelloWorld getHelloWorld(){
return helloWorld;
}
/**
* 新建实例
*/
public HelloWorld getHelloWorld2(){
return new HelloWorld();
}
}

4、添加测试代码

public class app {
public static void main(String[] args) {
// 获取 classpath 中的 Beans.xml 到上下文 context
//1.装载spring上下文配置文件,完成spring容器的初始化
ApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");
//2.从spring容器中获取bean-helloworld 实例1
IHelloWorld obj1 = (IHelloWorld) context.getBean("hello");
obj1.say("simm1");
//3.从spring容器中获取bean-helloworld 实例2
IHelloWorld obj2 = (IHelloWorld) context.getBean("hello");
obj2.say("simm2");
//3.从spring容器中获取bean-HelloWorldService 实例1(单例)
IHelloWorldService service = (IHelloWorldService)context.getBean("helloservice");
service.getHelloWorld().say("simm3");
service.getHelloWorld().say("simm4");
//3.从spring容器中获取bean-HelloWorldService 实例2(单例)
IHelloWorldService service2 = (IHelloWorldService)context.getBean("helloservice");
service2.getHelloWorld2().say("simm5");
service2.getHelloWorld2().say("simm6");
// 关闭上下文,防止内存泄漏
((ClassPathXmlApplicationContext) context).close();
}
}

5、测试结果显示,从spring容器中两次获取HelloWorldService服务,确实只运行了一次,说明默认情况下Component确实是单例的,而HelloWorld组件每次获取都是创建新的对象,属于多例模式。服务中自动装载的HelloWorld组件(@AutoWired)在单例的组件中使用时,要考虑清楚对象的生命周期。

参考资料

https://www.cnblogs.com/lonecloud/p/5745902.html

http://blog.csdn.net/qiuhan/article/details/45581371

spring 组件自动装载示例(@ComponentScan,@Component,@Scope)的更多相关文章

  1. spring 组件@Scope(request,session)示例

    上回说到, spring组件的注解Scope大约有singleton.prototype.request.session.global session 这么几种常用的场景.这里需要特别说明一下,根据源 ...

  2. 【译】Spring 4 自动装配、自动检测、组件扫描示例

    前言 译文链接:http://websystique.com/spring/spring-auto-detection-autowire-component-scanning-example-with ...

  3. Spring Boot 自动配置的原理、核心注解以及利用自动配置实现了自定义 Starter 组件

    本章内容 自定义属性快速入门 外化配置 自动配置 自定义创建 Starter 组件 摘录:读书是读完这些文字还要好好用心去想想,写书也一样,做任何事也一样 图 2 第二章目录结构图 第 2 章 Spr ...

  4. Spring组件扫描<context:component-scan/>使用详解

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

  5. 转 Spring 组件 <context:component-scan base-pakage="">用法

    1.如果不想在xml文件中配置bean,我们可以给我们的类加上spring组件注解,只需再配置下spring的扫描器就可以实现bean的自动载入. <!-- 注解注入 --> <co ...

  6. spring Bean类自动装载实现

    先贴spring的开发文档,有助于大家学习http://shouce.jb51.net/spring/beans.html#beans-factory-class 一直想研究一下spring bean ...

  7. Spring核心技术(八)——Spring自动装载的注解

    本文针对自动装载的一些注解进行描述. 基于注解的容器配置 @Required注解 @Required注解需要应用到Bean的属性的setter方法上面,如下面的例子: public class Sim ...

  8. Spring深入浅出(二)IOC的单例 ,继承,依赖,JDBC,工厂模式以及自动装载

    IOC的单例模式--Bean Spring中的bean是根据scope来决定的. scope有4种类型: 1.singleton:单例模型,表示通过Spring容器获取的该对象是唯一的.常用并且默认. ...

  9. Spring框架——IOC 自动装载

    IOC自动装载有两种形式 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...

随机推荐

  1. 用C#编写Linux守护进程

    如果要在Red Hat Enterprise Linux上将.NET Core进程作为后台进程运行,则可以创建自定义systemd单元.今天我将为.NET Core编写两个自定义系统单元的例子.一个是 ...

  2. ETL工具--kettle篇(17.10.09更新)

    ETL是EXTRACT(抽取).TRANSFORM(转换).LOAD(加载)的简称,实现数据从多个异构数据源加载到数据库或其他目标地址,是数据仓库建设和维护中的重要一环也是工作量较大的一块.当前知道的 ...

  3. wigs的理解和应用

    1. 首先了解下,Web应用的本质,大体如下: 1.浏览器发送一个HTTP请求: 2.服务器收到请求,生成一个HTML文档: 3.服务器把HTML文档作为HTTP响应的Body发送给浏览器: 4.浏览 ...

  4. Java this 关键字的用法

    this 关键字的用法 this 在类中就是代表当前对象,可以通过 this 关键字完成当前 对象的成员属性.成员方法和构造方法的调用. 那么何时用 this? 当在定义类中的方法时,如果需要调用该类 ...

  5. linux_初始参数选择

    目前linux发行版? linux内核 : Linux Kernel2.2  2.4  2.6  3.x 发行版本: Red Hat 主流 6.x, 正在发展 7.x Fedora: 为Red Hat ...

  6. python_如何判断字符串a以某个字符串开头或结尾?

    案例: 某文件系统目录下有一系列文件: 1.c 2.py 3.java 4.sh 5.cpp ...... 编写一个程序,给其中所有的.sh文件和.py文件加上可执行权限 如何解决这个问题? 1. 先 ...

  7. 11_什么是sql注入?

    什么是sql注入? --因为后台会把用户输入的插入到后台的sql语句中,来进行sql查询判断用户输入是否存在数据库中,     来验证用户是否合法,就会出现一个问题,用户在做用户验证的时候,在输入框注 ...

  8. sed 变量替换和Linux的特殊符号大全

    1 sed支持两种方式的变量替换,建议使用下面的第二种,比较简单 这样就可以给变量a赋值很多特殊字符了,比如 赋值a='!@#¥%……' sed -n 's/echo/'"$a"' ...

  9. junit的意义

    写了这么久代码了,自己从来没有好好的玩过junit.马上过年了,打算趁这段时间自己来写一套web框架,但是这里有一个很大的尴尬就是我平时编码并没有认真的来写测试类.那么自己在写框架的时候,不测试肯定是 ...

  10. 使用telnet发送HTTP请求

    使用telnet发送HTTP请求 写这篇博客,其实没有太大的实际意义,但是还是很有必要的,如果用好Telnet指令,就可以很好的理解HTTP的一些概念,特别是http1.1的持续链接. 要想使用Tel ...