Spring IOC装配Bean过程解析

Spring的依赖注入

Spring主要支持两种依赖注入方式,分别是属性注入和构造函数注入。同时也支持工厂方法注入方式。

属性注入

属性注入的方式非常简单,即指通过setXxx()方法注入Bean的属性值或依赖对象。如下实例

编写User类

public class User {
  private String username;
  private String address;
  public User() {
  }
  public User(String username, String address) {
    this.username = username;
    this.address = address;
  }
  public String getUsername() {
    return username;
  }
  public void setUsername(String username) {
    this.username = username;
  }
  public String getAddress() {
    return address;
  }
  public void setAddress(String address) {
    this.address = address;
  }
  @Override
  public String toString() {
    return "User{" +
        "username='" + username + '\'' +
        ", address='" + address + '\'' +
        '}';
  }
}

编写xml文件

<?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:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">

  <bean id="user" class="com.rookie.bigdata.domain.User">
    <property name="username" value="张三"></property>
    <property name="address" value="北京"></property>
  </bean>

</beans>

测试

ApplicationContext applicationContext=new ClassPathXmlApplicationContext("injection/bean.xml");

User user=(User)applicationContext.getBean("user");
System.out.println(user);

构造函数注入

构造函数注入是属性注入的另一种常用的注入方式。

xml配置方式如下

<bean id="user" class="com.rookie.bigdata.domain.User">
  <constructor-arg name="username" value="李四"></constructor-arg>
  <constructor-arg name="address" value="上海"></constructor-arg>
</bean>

注入参数

XML中含有5个特殊符号,分别是&,<,>,”,‘,如果配置文件中的注入值包含这些特殊的字符,就需要进行特殊的处理。有两种解决方法,其一:采用特殊标签,将包含特殊字符的字符串封装起来。其二:使用XML转义序列表示这些特殊字符。

<bean id="user" class="com.rookie.bigdata.domain.User">
  <property name="username" value="张三"></property>
  <!-- <property name="address" value="北京"></property>-->
  <property name="address">
    <value><![CDATA[北京&通州]]></value>
  </property>
</bean>
特殊字符 转义序列 特殊字符 转义序列
< &lt; &quot;
> &gt; ' &apos;
& &amp;

基于注解的配置

<context:component-scan base-package="com.rookie.bigdata.annotation"></context:component-scan>

component-scan 的base-package属性指定一个需要扫描的基类包,Spring容器会扫描这个基类包里面的所有的属性,并从类的注解信息中获取Bean的定义信息。

如果想扫描特定的类,可以使用resource-pattern属性过滤出特定的类。如:

<context:component-scan base-package="com.rookie.bigdata" resource-pattern="annotation/*.class"></context:component-scan>

即Spring仅会扫描基类包里annotation子包中的类。

通过使用resource-pattern发现,还是有很多时候并不满足要求,此时可以通过过滤表达式。如下:

类别 示例 说明
annotation com.rookie.bigdata.XxxAnnotation 所有标注了XxxAnnotation的类,该类型采用目标类是否标注了某个注解进行过滤
assignable com.rookie.bigdata.XxxService 所有继承或扩展XxxService的类,该类型采用目标类是否继承或扩展了某个特定类进行过滤
aspectj com.rookie.bigdata.*Service+ 所有类名以Service结束的类及继承或扩展它们的类,该类采用AspectJ表达式进行过滤
regex com\.rookie\.bigdata\.annotation\.* 所有com.rookie.bigdata.annotation类包下的类,该类型采用正则表达式根据目标类的类名进行过滤
custom com.rookie.bigdata.XxxTypeFilter 采用XxxTypeFile代码方式实现过滤规则。该类必须实现org.springframework.core.type.TypeFilter接口

<context:component-scan/>有一个容易忽视的use-default-filters属性,默认值为true;表示默认会对标注@Component、@Controller、@Service及Reposity的Bean进行扫描,<context:component-scan/>先根据<exclude-filter>列出需要排除的黑名单,再通过<include-filter>列出需要包含的白名单。

自动装配Bean

Spring通过@Authwired注解实现Bean的依赖注入

如下:

@Repository
public class UserDao {
  public UserDao(){
    System.out.println("实例化userDao");
  }
}
@Service
public class UserService {
  @Autowired
  private UserDao userDao;

}

@Autowired默认按照类型(byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标注的变量中

@Autowired还有一个required属性,默认情况下为true;表示必须找到匹配的Bean,否则会报NoSuchBeanDefinitionException异常。

@Autowired(required =true)
private UserDao userDao;

@Qualifier注解

如果容器中有一个以上的匹配Bean时,可以通过@Qualifier注解限定Bean的名称。如下:

@Repository
@Qualifier(value = "userDao")
public class UserDao {

  public UserDao(){
    System.out.println("实例化userDao");
  }

}
@Service
public class UserService {

  @Autowired(required =true)
  @Qualifier(value = "userDao")
  private UserDao userDao;

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 关于SpringBoot获取IOC容器中注入的Bean(推荐)

    一: 注入一个TestUtils类 package com.shop.sell.Utils; import com.shop.sell.dto.CartDTO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class TestUtils { @Bean(name="test

  • Spring bean的实例化和IOC依赖注入详解

    前言 我们知道,IOC是Spring的核心.它来负责控制对象的生命周期和对象间的关系. 举个例子,我们如何来找对象的呢?常见的情况是,在路上要到处去看哪个MM既漂亮身材又好,符合我们的口味.就打听她们的电话号码,制造关联想办法认识她们,然后...这里省略N步,最后谈恋爱结婚. IOC在这里就像婚介所,里面有很多适婚男女的资料,如果你有需求,直接告诉它你需要个什么样的女朋友就好了.它会给我们提供一个MM,直接谈恋爱结婚,完美! 下面就来看Spring是如何生成并管理这些对象的呢? 1.方法入口 o

  • spring在IoC容器中装配Bean详解

    1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean实例放入bean缓存池: 应用程序使用bean. 1.2.基于xml的配置 (1)xml文件概述 xmlns------默认命名空间 xmlns:xsi-------标准命名空间,用于指定自定义命名空间的schema文件 xmlns:xxx="aaaaa"-------自定义命名空间,xx

  • 浅谈springioc实例化bean的三个方法

    1.构造器 也就是在上一篇讲的那个例子,调用默认的无参构造函数 2.静态工厂方法 1)创建需要执行的方法的类 public class HelloWorld { public HelloWorld(){ System.out.println("aaaa"); } public void hello(){ System.out.println("hello world"); } } 2)创建静态工厂 public class HelloWorldFactory { p

  • 基于springioc bean 的几个属性介绍

    1.lazy-init="false" 默认值为false,指的是bean的创建时机的spring容器一启动就会加载这些类.有点是及时发现bean的相关错误,因为spring容器启动,bean也都会创建完毕,如果bean有什么差错都会报出,缺点就是如果bean对象的开销较大,那会提前占用内存. 如果设置为true,则等到spring容器去获取该bean的对象时才会创建.优缺点与false相反 2.scope="singleton" 默认值就是singleton,指的

  • spring ioc的简单实例及bean的作用域属性解析

    IoC(Inversion if Control)-控制反转是Spring俩大核心技术之一,IoC一般分为俩种类型:依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup) 使用示例: 1.新建工程并导入Spring相关jar包. 2.新建数据访问层及业务逻辑层 代码结构: 代码示例: /** * 实体Bean * @author BC * */ public class User { private Integer id; private

  • Spring为IOC容器注入Bean的五种方式详解

    这篇文章主要介绍了Spring为IOC容器注入Bean的五种方式详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一 @Import导入组件,id默认是组件的全类名 //类中组件统一设置.满足当前条件,这个类中配置的所有bean注册才能生效: @Conditional({WindowsCondition.class}) @Configuration @Import({Color.class,Red.class,MyImportSelector

  • 详解Spring框架---IOC装配Bean

    IOC装配Bean (1)Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数,用的最多) 静态工厂实例化 实例工厂实例化 下面先写这三种方法的applicationContext.xml配置文件: <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"

  • Spring IOC装配Bean过程解析

    Spring的依赖注入 Spring主要支持两种依赖注入方式,分别是属性注入和构造函数注入.同时也支持工厂方法注入方式. 属性注入 属性注入的方式非常简单,即指通过setXxx()方法注入Bean的属性值或依赖对象.如下实例 编写User类 public class User { private String username; private String address; public User() { } public User(String username, String addres

  • SPRING IOC注入方式过程解析

    这篇文章主要介绍了SPRING IOC注入方式过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring IOC注入的方法主要有两种 1:设值注入 2:构造注入 简单来说一个是调用set方法设值,一个是通过构造函数设值 Spring-ioc.xml <?xml version= "1.0" encoding= "UTF-8"?> <beans xmlns= "http://ww

  • Spring自动装配Bean实现过程详解

    这篇文章主要介绍了Spring自动装配Bean实现过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 要使用自动装配,就需要配置 <bean> 元素的 autowire 属性.autowire 属性有五个值,具体说明如表 1 所示. 表 1 autowire 的属性和作用 名称 说明 byName 根据 Property 的 name 自动装配,如果一个 Bean 的 name 和另一个 Bean 中的 Property 的 name 相

  • Spring整合MyBatis图示过程解析

    这篇文章主要介绍了Spring整合MyBatis图示过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.导入所需要的jar依赖 !--MyBatis和Spring的整合包 由MyBatis提供--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <vers

  • Spring Boot整合Spring Cache及Redis过程解析

    这篇文章主要介绍了Spring Boot整合Spring Cache及Redis过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 1.安装redis a.由于官方是没有Windows版的,所以我们需要下载微软开发的redis,网址: https://github.com/MicrosoftArchive/redis/releases b.解压后,在redis根目录打开cmd界面,输入:redis-server.exe redis.wind

  • spring boot整合kafka过程解析

    这篇文章主要介绍了spring boot整合kafka过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.启动kafka 启动kafka之前一定要启动zookeeper,因为要使用kafka必须要使用zookeeper. windows环境下启动,直接使用kafka自带的zookeeper: E:\kafka_2.12-2.4.0\bin\windows zookeeper-server-start.bat ..\..\config\z

  • JSP Spring 自动化装配Bean实例详解

    Spring 自动化装配Bean 声明一张cd的接口: public interface CompactDisc { public abstract void play(); } 实现cd接口: @Component("SgtPeppers") public class SgtPeppers implements CompactDisc { private String title = "Sgt.Pepper's Lonely Hearts Club Band";

  • Spring Boot 整合 Druid过程解析

    这篇文章主要介绍了Spring Boot 整合 Druid过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 概述 Druid 是阿里巴巴开源平台上的一个项目,整个项目由数据库连接池.插件框架和 SQL 解析器组成.该项目主要是为了扩展 JDBC 的一些限制,可以让程序员实现一些特殊的需求,比如向密钥服务请求凭证.统计 SQL 信息.SQL 性能收集.SQL 注入检查.SQL 翻译等,程序员可以通过定制来实现自己需要的功能. Druid 是

  • Spring boot整合log4j2过程解析

    这篇文章主要介绍了Spring boot整合log4j2过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以前整合过log4j2,但是今天再次整合发现都忘记了,而且也没有记下来 1.pom.xml中 (1)把spring-boot-starter-web包下面的spring-boot-starter-logging排除 <dependency> <groupId>org.springframework.boot</gr

随机推荐