Spring装配机制

Spring提供了三种主要的装配机制:

1:通过XML进行显示配置

2:通过Java代码显示配置

3:自动化装配

自动化装配

Spring中IOC容器分两个步骤来完成自动化装配:

组件扫描:Spring会自动发现应用上下文中所创建的 bean(通过定义资源的方式,让 Spring IoC 容器扫描对应的包,从而把 bean 装配进来)

自动装配:spring自动满足满足bean之间的依赖(通过注解定义,使得一些依赖关系可以通过注解完成。)

1 使用@Compoent注解申明bean

这两天看出,冒出最多的一个词语“装配” 什么叫装配?谁能装配谁?引用书上的解释:创建应用对象之间写作关系的行为通常称为装配,这也是依赖注入的本质。定义解释了第一个疑问,那么谁装配谁?显然是spring容器装配bean。

使用@Compoent注解,表明该类作为组件类,需要Spring IOC容器为这个类创建bean。

package com.sl.ioc;
import org.springframework.stereotype.Component; @Component
public class Dog
{
private Breed breed;
public Breed getBreed() {
return breed;
} public void setBreed(Breed breed) {
this.breed = breed;
}
}

仅通过@Component注解Spring容器并不会主动创建bean,因为Spring的组件扫描默认是不启用的,就是说Spring根本还不认识这个类,所以我们需要启用Spring组件扫描,方式有两种:

A: 使用@ComponentSacn注解发现bean

package com.sl.ioc;

import org.springframework.context.annotation.ComponentScan;

import org.springframework.context.annotation.Configuration;

@Configuration
@ComponentScan //启用组件扫描
public class AnimalConfig { }

其实这个类并没有什么内容,默认情况下@ComponentScan会告知Spring扫描AnimalConfig所在的jar包下所有含有@Component修饰的类,并且通过IOC容器创建bean,到这里,可以创建一个测试类看一下结果了

package com.sl.ioc;

import static org.junit.Assert.assertNotNull;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class TestClass {

   @Test
public void TestGetDoInstance() {
//应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class); Dog dog = (Dog) context.getBean("dog"); assertNotNull(dog);
}
}

运行代发可以发现对象dog已经实例化了。

上面的代码context.getBean("dog")可以发现,从应用上下文中获取bean时传的ID是”dog”,这是因为@Component注解默认将类名的首字母小写后作为bean的ID,当然也支持显示为bean设置ID,比如上面的代码想设置Bean标识为二哈,

这样既可@Component("huskyDog")  使用传入beanname: context.getBean("huskyDog");

同样关于@ ComponentScan  默认扫描被修饰类所在的包,如果需要扫描其他包也可以,只需要通过value属性传入包名即可@ComponentScan("com.sl.ioc")

Value其实允许传入一个String[]数组,那么扫描多个包@ComponentScan(value= {"com.sl.ioc","com.sl.aop"}),验证代码这里略过

启用组件扫描还有另外一种方式:使用XML配置

<context:component-scan base-package="com.sl.ioc"></context:component-scan>

2 使用@Autowried注解自动装配bean

通过前面的内容,已经可以让Spring自动发现bean并装载到应用上下文中,那么自动装配就是在这个基础上,将bean自动注入到依赖他的地方。@Autowired注解由Spring提供,可以对成员变量、方法以及构造函数进行注释

package com.sl.ioc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component("animalD")
public class Animal { @Autowired
private Dog dog; public void AnimalAction() { dog.Say(); }
}
package com.sl.ioc;
import org.springframework.stereotype.Component; @Component("huskyDog")
public class Dog //extends Animal
{
private Breed breed; private String name; private Color color; public Breed getBreed() {
return breed;
} public void setBreed(Breed breed) {
this.breed = breed;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Color getColor() {
return color;
} public void setColor(Color color) {
this.color = color;
} public void Say() {
System.out.println("dog");
} }
package com.sl.ioc;
import static org.junit.Assert.assertNotNull;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.yi.aop.User; //@RunWith(SpringJUnit4ClassRunner.class)
//@ContextConfiguration(classes=AnimalConfig.class)
public class TestClass {
@Test
public void TestGetDoInstance() {
//应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class); Animal animal = (Animal) context.getBean("animalD"); animal.AnimalAction();
}
}

当然用在构造函数或者属性Setter方法上也可以:如下

通过构造函数注入

package com.sl.ioc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component; @Component("animalD")
public class Animal { private Dog dog; @Autowired
public void Animal(Dog dog) {
this.dog = dog;
} public void AnimalAction()
{
dog.Say();
}
}

通过Setter方法注入

package com.sl.ioc;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component("animalD")
public class Animal { private Dog dog; public void Animal() { } public Dog getDog() {
return dog;
} @Autowired
public void setDog(Dog dog) {
this.dog = dog;
} public void AnimalAction() { dog.Say();
}
}

测试代码同上,略 。

使用@Autowired注解后,Spring尝试从上下文中寻找对应的Bean,并将其注入到依赖它的位置,需要注意的是如果上下文中找不到对应的bean,则会抛异常,可以通过设置required=false来解决,但是使用bean对象的地方需要做null判断

通过Java代码装配bean

自动化装配自有它的优势,但是也有它缺陷

  1:代码中硬编码

  2:无法解决使用第三方组件的问题

所以必要时还是需要进行显示装配Java代码或者XML

首先定义一个Config类,并且添加@Configuration注解, 标志这是一个配置类; 其中@Bean注解标识这个方法返回的bean对象并且需要装载到Spring应用的上下文中,默认情况下这个bean对象的name为该方法名DogInstance, @Bean注解支持为

Bean对象起别名,通过name属性设置即可

package com.sl.ioc;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class AnimalConfig {
@Bean("dog")
public Dog DogInstance() {
return new Dog();
} @Bean("animal")
public Animal GetAnimal(Dog dog)
{
return new Animal(dog);
}
}

测试代码:

package com.sl.ioc;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertSame;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.yi.aop.User;
public class TestClass { @Test
public void TestGetDoInstance() {
//应用上下文
ApplicationContext context = new AnnotationConfigApplicationContext(AnimalConfig.class);
Dog dog = (Dog)context.getBean("dog");
dog.Say();
Animal animal = (Animal) context.getBean("animal");
animal.AnimalAction();
assertSame(dog, animal.getDog());
} }

解释一下:GetAnimal(Dog dog)本身依赖于Dog,Spring在调用次方法创建Animal 对象时会自动从上下文中寻找Dog对应的bean对象并注入到Animal构造函数中

通过XML装配Bean

使用XML装配bean需要在工程下创建一个标准的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: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="cat" class="com.sl.ioc.Cat" ></bean> </beans>

通过属性注入初始化bean

具体配置文件如下

<?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 -->
<bean id="cat" class="com.sl.ioc.Cat" >
<property name="name" value="testCat"></property>
<property name="color" value="YELLOW"></property>
<property name="strs">
<list>
     <value>str1</value>
     <value>str2</value>
   </list>
</property>
</bean>
</beans>

使用<property>元素进行属性注入,其中name为对象属性名,value为需要注入的值,通过在<property>元素中内<list>元素进行集合的注入

package com.sl.ioc;
import java.util.List;
public class Cat { private String name;
private Color color;
private List<String> strs;
public List<String> getStrs() {
return strs; }
public void setStrs(List<String> strs) {
this.strs = strs;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Color getColor() {
return color;
} public void setColor(Color color) {
this.color = color;
}
}

测试代码:

   @Test
public void TestGetDoInstance() {
//应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("xmlbean.xml");
Cat cat = (Cat)context.getBean("cat");
//cat.setName("Persian");
System.out.println(cat.getName());
System.out.println(cat.getColor());
for(String s:cat.getStrs())
{
System.out.println(s);
}
}

通过构造函数注入初始化bean

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: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="cat" class="com.sl.ioc.Cat" >
  <constructor-arg name="name" value="testCat"></constructor-arg>
  <constructor-arg name="color" value="YELLOW"></constructor-arg>
</bean> <bean id="cat2" class="com.sl.ioc.Cat" >
  <constructor-arg name="strs">
    <list>
      <value>str1</value>
      <value>str2</value>
    </list>
  </constructor-arg>
</bean>
</beans>

用<constructor-arg>元素进行构造函数参数注入<constructor-arg name="xxx" value="xxx"></constructor-arg>

name:对应构造函数参数名,value:需要注入的值

list:对应参数类型是集合,具体值通过多个value属性来设置

其他<set> <map>等类型略

package com.sl.ioc;
import java.util.List;
public class Cat {
//通过构造函数注入
public Cat(String name,Color color){
this.name = name;
this.color = color;
} //通过构造函数注入List
public Cat(List<String> strs){
this.strs = strs;
} private String name;
private Color color;
private List<String> strs;

public List<String> getStrs() {
return strs;
} public void setStrs(List<String> strs) {
this.strs = strs;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Color getColor() {
return color;
} public void setColor(Color color) {
this.color = color;
}
}

测试代码:

  @Test
public void TestGetDoInstance() {
//应用上下文
ApplicationContext context = new ClassPathXmlApplicationContext("xmlbean.xml");
Cat cat = (Cat)context.getBean("cat"); System.out.println(cat.getName());
System.out.println(cat.getColor()); Cat cat2 = (Cat)context.getBean("cat2");
for(String s:cat2.getStrs())
{
System.out.println(s);
}
}

Spring温故而知新 – bean的装配的更多相关文章

  1. Spring温故而知新 - bean的装配(续)

    按条件装配bean 就是当满足特定的条件时Spring容器才创建Bean,Spring中通过@Conditional注解来实现条件化配置bean package com.sl.ioc; import ...

  2. Spring温故而知新 - bean的装配

    Spring装配机制 Spring提供了三种主要的装配机制: 1:通过XML进行显示配置 2:通过Java代码显示配置 3:自动化装配 自动化装配 Spring中IOC容器分两个步骤来完成自动化装配: ...

  3. Spring - 配置Bean - 自动装配 关系 作用域 引用外部属性文件

    1 Autowire自动装配1.1 使用:只需在<bean>中使用autowire元素<bean id="student" class="com.kej ...

  4. Spring 中Bean的装配方式

    最近又买了一本介绍SSM框架的书,是由黑马程序员编写的,书上讲的很好理解,边看边总结一下.主要总结一下bean的装配方式. Bean的装配可以理解为依赖系统注入,Bean的装配方式即Bean依赖注入的 ...

  5. Spring之Bean的装配

    一.Bean的装配Bean的装配,即Bean对象的创建.容器根据代码要求创建Bean对象后再传递给代码的过程,称为Bean的装配.1.默认装配方式代码通过getBean()方式从容器获取指定的Bean ...

  6. Spring ( 三 ) Spring的Bean的装配与生命周期、专用测试

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 一.对象的生命周期 1.IOC之Bean的生命周期 创建带有生命周期方法的bean public cla ...

  7. java开发两年,连Spring中bean的装配都不知道?你怎么涨薪啊

    Spring 1.1.1.1 创建一个bean package com.zt.spring; public class MyBean { private String userName; privat ...

  8. [spring]spring的bean自动装配机制

    7.bean的自动装配 是spring满足bean依赖的一种方式 spring会在上下文中自动寻找,并自动给bean装配属性 spring的装配方式: (1)手动装配 在people类中依赖了cat和 ...

  9. Spring笔记2——Spring中Bean的装配

    1.引言 Spring中,对象无需自己负责查找或创建与其关联的其他对象,而是由容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间的协作关系的行为通常称为装配(Wiring),这也是依赖注入 ...

随机推荐

  1. Hibernate知识点小结(四)--JPA

    一.jpa的简介和入门 JPA:Java Persistence API,接口规范    Hinernate内部为JPA规范提供实现        开发步骤(EntityManager):       ...

  2. web常用软件

    编辑器: VSCode HBuilder WebStorm NotePad++ Eclipse Atom 常用插件: SwitchyOmega Vue-Tools server类: tomcat Ng ...

  3. mongo复制集脑裂问题如何处理

    mongo replication 脑裂问题如何处理: 一.问题描述:一套mongo replication有4个节点.1个仲裁节点.在停止实例(或实例毁坏)的时候,导致所有节点都变为SECONDAR ...

  4. Java集合类——Set、List、Map、Queue接口

    目录 Java 集合类的基本概念 Java 集合类的层次关系 Java 集合类的应用场景 一. Java集合类的基本概念 在编程中,常需要集中存放多个数据,数组是一个很好的选择,但数组的长度需提前指定 ...

  5. Linux系统磁盘管理

    1 Linux磁盘管理体系简介 Linux磁盘管理分为五个步骤:首先在服务器上添加相应的硬盘(如/dev/sda.sdb.sdc等),对全新的服务器(即没有操作系统)做硬RAID0.RAID1.RAI ...

  6. Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO

    你有碰上过这样的提示吗? Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in t ...

  7. YII2.0 用GII创建视图文件后访问404

    使用GII的CRUD Generator创建searchModelClass 和控制器类文件,视图文件后,访问控制器地址后出现404的情况. 创建过程如图所示 后来发现是控制器类 Controller ...

  8. 日志框架Log4j

    log4j是一个用Java编写的可靠,快速和灵活的日志框架(API),它在Apache软件许可下发布.Log4j已经被移植到了C,C++,C#,Perl,Python和Ruby等语言中. Log4j是 ...

  9. python基础之多线程

    概念 进程:进程就是一个程序在一个数据集上的一次动态执行过程 程序:代码 数据集:程序执行过程中需要的资源 进程控制块:完成状态保存的单元 线程:线程是寄托在进程之上,为了提高系统的并发性 线程是进程 ...

  10. jsp中的input

    Input表示Form表单中的一种输入对象,其又随Type类型的不同而分文本输入框,密码输入框,单选/复选框,提交/重置按钮等,下面一一介绍. 1,type=text 输入类型是text,这是我们见的 ...