一、使用注解配置Bean

1、注解

  在类定义、方法定义、成员变量定义前使用。其简化<bean>标签,功能同<bean>标签。
格式为:
  @注解标记名。

2、组件扫描

  Spring可以从classpath(类路径)下自动扫描、实例化具有特殊注解的组件。
常用注解:
(1)@Repository   一般用于数据访问(数据访问(持久)层组件,实现dao访问)
(2)@Service    一般用于服务(业务层组件,处理业务逻辑,比如注入并操作dao)
(3)@Controller    一般用于控制器(控制层组件)
(4)@Component    一般用于自定义组件,把普通类实例化到spring容器中,相当于配置文件中的<bean id="" class=""/>
(5)@Scope    用于控制对象创建,默认为单例模式。
(6)@PostConstruct    用于指定init-method方法。
(7)@PreDestroy    指定destroy-method方法。
(8)@Resource    用于注入bean对象
(9)@Autowired   基本等价于 @Resource
(10)@Qualifier("XXX")    与@Autowired连用,强制按名称匹配。
(11)@value("")    Spring表达式注入。

需要在xml文件中配置自动扫描。

需要在applicationContext.xml中开启自动扫描。
其中base-package填写的是需要扫描的包名(可以只写一部分,比如base-package="com",那么将会扫描以com开头的所有包)。多个包名间用逗号(,)隔开。
<beans>
<context:component-scan base-package="com.test"></context:component-scan>
</beans>

对于扫描到的类,Spring默认命名为首字母小写。


@Controller
public class LoginController{
} 等价于
<bean id="loginController" class="XXX.LoginController"/>

3、@component

  第一种形式:直接在类的前面写@component,其会自动将类名当做id,且首字母小写。

package com.test;

import org.springframework.stereotype.Component;

/**
* 扫描ExampleBean组件,默认id=exampleBean
* 相当于<bean id="exampleBean"></bean>
* 注:id名的首字母小写。
*/
@Component
public class ExampleBean {
public void execute() {
System.out.println("执行execute处理方法1");
}
}

  第二种形式:自定义id名。

package com.test;

import org.springframework.stereotype.Component;

/**
* 相当于<bean id="test"></bean>
*
*/
@Component("test")
public class ExampleTest {
public void show() {
System.out.println("hello world");
}
}

4、@Scope

  默认为单例模式(根据同一个id,getBean获取的都是同一个对象),可以采用@Scope("prototype") 来将其变成原型模式(根据同一个id,getBean获取的都是不同的对象)。

package com.test;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; /**
* 扫描ExampleBean组件,默认id=exampleBean
* 相当于<bean id="exampleBean"></bean>
* 注:id名的首字母小写。
*/
@Component
@Scope("prototype") //等价于<bean scope="prototype">
public class ExampleBean {
public void execute() {
System.out.println("执行execute处理方法1");
}
}

5、@PostConstruct

  设置初始化方法。

package com.test;
import javax.annotation.PostConstruct;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component; @Component
@Scope("prototype") //等价于<bean scope="prototype">
public class ExampleBean {
public void execute() {
System.out.println("执行execute处理方法1");
} @PostConstruct //等价于<bean init-method="init">
public void init() {
System.out.println("初始化");
}
}

6、@PreDestroy

  设置销毁方法。

package com.test;
import javax.annotation.PostConstruct;
import org.springframework.stereotype.Component; @Component
public class ExampleBean {
public void execute() {
System.out.println("执行execute处理方法1");
} @PostConstruct //等价于<bean init-method="init">
public void init() {
System.out.println("初始化");
} @PreDestroy //等价于<bean destory-method="destory">
public void destory() {
System.out.println("释放资源");
}
}

7、@Resource

  其可以写在变量定义前,也可以写在setXXX方法前。@Resource默认按照ByName自动注入。@Resource有两个重要的属性:name和type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以,如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不制定name也不制定type属性,这时将通过反射机制使用byName自动注入策略。
  其导入包:import javax.annotation.Resource;
注:
  使用注解时,若@Resource注解写在变量定义前,那么setXXX方法可以不写。
  但若是在xml文件中采用<bean>标签的set注入,需要实现setXXX方法。

@Resource装配顺序:
  step1:如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
  step2:如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
  step3:如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
  step4:如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

private Computer computer;

@Resource
private Phone phone; //插入类型为Phone的对象 @Resource //注入bean对象
public void setComputer(Computer computer) {
this.computer = computer;
}

8、@Autowired

  基本等价于 @Resource。@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用
  其导入包:import org.springframework.beans.factory.annotation.Autowired;

private Computer computer;

@Autowired
private Phone phone; //插入类型为Phone的对象 @Autowired //注入bean对象
public void setComputer(Computer computer) {
this.computer = computer;
}

9、@Resource与@Autowired的区别

  @Resource的作用相当于@Autowired,只不过@Autowired默认按照byType自动注入。@Resource默认按 byName自动注入
注:
  构造器注入时,只能使用@Autowired。
  Set注入时,可以使用@Autowired或者@Resource(推荐)。

容器中存在多个同类型的对象时,若@Autowired放在setXX方法前,那么只依据类型(ByType)去匹配。若想使@Autowired 按照byName匹配,需与@Qualifier("")连用。

@Autowired
@Qualifier("computer")
private Computer computer;

  @Resource放在setXXX方法前,会先依据XXX(默认ByName)去匹配,可以设置是否按照byName或者byType匹配。

@Resource(name="phone")  //等价于  @Resource,根据byName匹配。  

Spring 注解配置Bean的更多相关文章

  1. 5.spring:注解配置 Bean

    在classpath中扫描组件 组键扫描:能够从classpath下自动扫描,侦测和实例化具有特定注解的组件 特定的组件包括: ->@Componment:基于注解,标识一个受Spring管理的 ...

  2. [原创]java WEB学习笔记103:Spring学习---Spring Bean配置:基于注解的方式(基于注解配置bean,基于注解来装配bean的属性)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  3. Spring(二)--FactoryBean、bean的后置处理器、数据库连接池、引用外部文件、使用注解配置bean等

    实验1:配置通过静态工厂方法创建的bean  [通过静态方法提供实例对象,工厂类本身不需要实例化!] 1.创建静态工厂类 public class StaticFactory { private st ...

  4. Spring(十五):通过注解配置 Bean

    在ClassPath中扫描组件 1)组件扫描(component scanning):Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件: 2)特定组件包含: --- @C ...

  5. IDEA02 利用Maven创建Web项目、为Web应用添加Spring框架支持、bean的创建于获取、利用注解配置Bean、自动装配Bean、MVC配置

    1 环境版本说明 Jdk : 1.8 Maven : 3.5 IDEA : 专业版 2017.2 2 环境准备 2.1 Maven安装及其配置 2.2 Tomcat安装及其配置 3 详细步骤 3.1 ...

  6. Spring IOC机制之使用注解配置bean

    一. 通过注解配置bean 1.1       概述 相对于XML方式而言,通过注解的方式配置bean更加简洁和优雅,而且和MVC组件化开发的理念十分契合,是开发中常用的使用方式. 1.2       ...

  7. Spring框架入门之基于Java注解配置bean

    Spring框架入门之基于Java注解配置bean 一.Spring bean配置常用的注解 常用的有四个注解 Controller: 用于控制器的注解 Service : 用于service的注解 ...

  8. (转)Spring注解完成Bean的定义

    使用Spring注解完成Bean的定义 2010-04-21 16:48:54|  分类: spring|举报|字号 订阅     下载LOFTER客户端     通过@Autowired或@Reso ...

  9. 通过注解配置Bean

    之前说的三种配置方式,都是使用XML配置,现在我们说说使用注解配置Bean. 这部分内容主要分为两个部分:使用注解配置Bean,使用注解配置Bean属性. 在classpath中扫描组件 组件扫描:S ...

随机推荐

  1. JAVA描述算法和数据结构(01):稀疏数组和二维数组转换

    本文源码:GitHub·点这里 || GitEE·点这里 一.基本简介 1.基础概念 在矩阵中,若数值为0的元素数目远远多于非0元素的数目,并且非0元素分布没有规律时,则称该矩阵为稀疏矩阵:与之相反, ...

  2. Django多数据库

    每个app使用不同的数据库 1. 配置数据库连接 # settings.py # DATABASES中必须要有default字段 DATABASES = { 'default': { 'ENGINE' ...

  3. ros2中创建一个python package

    完整的python package的目录结构如下: source /opt/ros/dashing/setup.bash cd ros2_ws/src && ros2 pkg crea ...

  4. .net core 反射的介绍与使用

      1. 概述反射 通过反射可以提供类型信息,从而使得我们开发人员在运行时能够利用这些信息构造和使用对象. 反射机制允许程序在执行过程中动态地添加各种功能.   2. Type类的介绍  是BCL(基 ...

  5. css基础,css选择器

    07.29自我总结 css基础 一.什么是CSS CSS是级联样式表 CSS术语标记语言,没有逻辑 CSS作用 完成网页内容的样式与布局 二.CSS的三种引入方式 1. 内联式 书写位置:在 head ...

  6. swift多线程定时器

    swift多线程定时器的使用 func countDown(_ timeOut:Int,view: UIView){ var timeout = timeOut let queue:DispatchQ ...

  7. Thymeleaf对象的使用:数字对象

    Thymeleaf主要使用 org.thymeleaf.expression.Numbers 类处理数字,在模板中使用 #numbers 对象来处理数字. 开发环境:IntelliJ IDEA 201 ...

  8. iTerm2 使用代理

    0x00 事件 因为 brew 安装极慢,所以需要 iTerm2 设置代理解决速度问题. 0x01 解决 代理软件开启本地 Http 端口: iTerm 设置代理: $ vim ~/.zshrc # ...

  9. 读书笔记_python网络编程3(6)

    6.TLS/SSL 6.0. 传输层安全协议(TLS, Transport Layer Security)是如今web上应用最广泛的加密方法了,1999年成为互联网标准.前身是安全套接层(SSL, S ...

  10. filebench - File system and storage benchmark - 模拟生成各种各样的应用的负载 - A Model Based File System Workload Generator

    兼容posix 接口的文件系统中我们不仅要测试 posix 接口是否兼容.随机读,随机写,顺序读,顺序写等读写模式下的性能.我们还要测试在不同工作负载条件下的文件系统的性能的情况:Filebench ...