Spring Bean详解
Spring Bean
在Spring的应用中,Spring IoC容器可以创建、装配和配置应用组件对象,这里的组件对象称为Bean。
Bean的配置
Spring可以看作一个大型工厂,用于生产和管理Spring容器中的Bean。如果要使用这个工厂生产和管理Bean,需要开发者将Bean配置在Spring的配置文件中,Spring框架支持XML和Properties两种格式的配置文件,在实际开发中常用XML格式的配置文件。
从前面的内容得知XML配置文件的根元素是<beans>,<beans>中包含了多个<bean>子元素,每个<bean>元素定义<bean>,并描述Bean如何被装配到Spring容器中,<bean>元素的常用属性及其子元素如下所示
| 属性或子元素名称 | 描述 | 
|---|---|
id | 
Bean在BeanFactory中的唯一标识,在代码中通过BeanFactory获取Bean实例时使用的索引名称。 | 
class | 
Bean的具体实现类,使用全类名描述。 | 
scope | 
指定Bean实例的作用域。 | 
<construct-arg> | 
<bean>元素的子元素,使用构造方法注入,指定构造方法的参数,该元素的index属性指定参数的序号,ref属性指定对BeanFactory中其他Bean的引用关系,type属性指定参数类型,vlaue属性指定参数的常量值。 | 
<property> | 
<bean>元素的子元素,用于设置一个属性,该元素的name属性指定Bean实例中相应属性名称,value指定Bean的属性值,ref属性指定属性对BeanFactory中其他Bean的引用关系。 | 
<list> | 
<property>元素的子元素,用于封装List或数组类型的依赖注入。 | 
<map> | 
<property>元素的子元素,用于封装map类型的依赖注入。 | 
<set> | 
<property>元素的子元素,用于封装set类型的依赖注入。 | 
<entry> | 
<map>元素的子元素,用于设置一个键值对。 | 
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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--将指定类TestDIDaoImpl配置给Spring,让Spring为其创建实例-->
    <bean id="myTestDIDao" class="dao.Impl.TestDIDaoImpl"/>
    <!--使用构造方法注入-->
    <bean id="testDIService" class="service.Impl.TestDIServiceImpl">
    <!--将myTestDIDao注入到TestDIServiceImpl类的属性的TestDIDao上-->
        <constructor-arg index="0" ref="myTestDIDao"/>
    </bean>
    <!--使用setter方法注入-->
    <bean id="testDIService_setter" class="service.Impl.TestDIServiceImpl_setter">
        <!--调用setter方法,将myTestDIDao注入到方法的属性中-->
        <property name="testDIDao" ref="myTestDIDao"/>
    </bean>
</beans>
Bean的实例化
在面向对象中,如果想要使用某个对象,需要事先实例化该对象,同样,在Spring框架中,如果想使用Spring容器中的Bean,也需要实例化Bean,Spring框架实例化Bean有3种方式,即构造方法实例化,静态工厂实例化和实例工厂实例化(最常用的是构造方法实例化)。
构造方法实例化
在Spring框架中,Spring容器可以调用Bean对应类中的无参构造方法来实例化Bean,这种方式称为构造方法实例化。
- 创建BeanClass类
 
package instance;
public class BeanClass {
    public String message;
    public BeanClass(){
        message="构造方法实例化Bean";
    }
    public BeanClass(String s){
        message=s;
    }
}
- 创建配置文件
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--构造方法实例化Bean-->
    <bean id="constructorInstance" class="instance.BeanClass"/>
</beans>
- 创建测试类
 
package Test;
import instance.BeanClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInstance {
    public static void main(String[] args) {
        ApplicationContext appCo=new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanClass beanClass = (BeanClass) appCo.getBean("constructorInstance");
        System.out.println(beanClass+beanClass.message);
    }
}
静态工厂实例化
在使用静态工厂实例化Bean时要求开发者在工厂类中创建一个静态方法来创建Bean的实例,在配置Bean时,class属性指定静态工厂类,同时还需要使用factory-method属性指定工厂类中的静态方法,下面通过实例测试静态工厂实例化
- 创建工厂类
BeanStaticFactory 
package instance;
public class BeanStaticFactory {
    private static BeanClass beanInstanece=new BeanClass("调用静态工厂方法实例化");
    public static BeanClass createInstance(){
        return beanInstanece;
    }
}
- 编辑配置文件
 
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
        <!--静态工厂实例化-->
    <bean id="staticFactory" class="instance.BeanStaticFactory" factory-method="createInstance"/>
</beans>
- 添加测试代码
 
package Test;
import instance.BeanClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInstance {
    public static void main(String[] args) {
        ApplicationContext appCo=new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanClass beanClass = (BeanClass) appCo.getBean("staticFactory");
        System.out.println(beanClass+beanClass.message);
    }
}
实例工厂实例化
在使用实例工厂实例化Bean时要求开发者在工厂类中创建一个实例方法来创建Bean的实例,在配置Bean时需要使用factory-bean属性指定配置的实例工厂,同时还需要使用factory-method属性指定实例工厂中的实例方法。下面通过代码测试实例工厂实例化。
- 创建工厂类
BeanInstanceFactory 
package instance;
public class BeanInstanceFactory {
    public BeanClass createBeanClassInstance(){
        return new BeanClass("调用实例工厂实例化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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd">
    <!--配置工厂-->
    <bean id="myFactory" class="instance.BeanInstanceFactory"/>
    <!--使用factory-bean属性指定配置工厂,使用factory-method属性指定使用哪个方法实例化-->
    <bean id="instanceFactoryInstance" factory-bean="myFactory" factory-method="createBeanClassInstance"/>
</beans>
- 测试方法
 
package Test;
import instance.BeanClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInstance {
    public static void main(String[] args) {
        ApplicationContext appCo=new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanClass beanClass = (BeanClass) appCo.getBean("instanceFactoryInstance");
        System.out.println(beanClass+beanClass.message);
    }
}
Bean的作用域
在Spring中不但可以完成Bean的实例化,还可以指定Bean的作用域,在Spring中定义实例化Bean的作用域如下:
| 作用域名称 | 描述 | 
|---|---|
singleton | 
默认的作用域,使用singleton定义的Bean在Spring容器中只有一个Bean实例。 | 
prototype | 
Spring容器每次获取prototype定义的Bean,容器都将创建一个新的Bean实例。 | 
requesrt | 
在一次HTTP请求中容器将返回一个Bean实例,不同的HTTP请求返回不同的Bean实例,仅在Web应用中使用。 | 
session | 
在一个HTTPSession中,容器将返回一个Bean实例,仅在Web应用中使用。 | 
application | 
为每个ServletContext对象创建一个实例,即同一个应用共享一个Bean实例,仅在Web应用使用。 | 
websocket | 
为每个WebSocket对象创建一个实例,仅在Web应用使用。 | 
在上表中,
singleton和prototype是最常用的两种,后面4种仅在Web应用使用。
Singleton作用域
当将bean的scope设置为singleton时,Spring IoC容器仅生成和管理一个Bean对象,在使用id获取Bean实例时,IoC容器将返回共享的Bean实例。
由于singleton是scope的默认方式,因此可以不写。
测试singleton作用域,代码如下:
package Test;
import instance.BeanClass;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestInstance {
    public static void main(String[] args) {
        ApplicationContext appCo=new ClassPathXmlApplicationContext("applicationContext.xml");
        BeanClass beanClass1 = (BeanClass) appCo.getBean("instanceFactoryInstance");
        System.out.println(beanClass1+beanClass1.message);
        BeanClass beanClass2 = (BeanClass) appCo.getBean("instanceFactoryInstance");
        System.out.println(beanClass2+beanClass2.message);
    }
}
获取到两个对象的hash值相同,因此是同一个对象。
prototype作用域
当将bean的scope设置为prototype时,SpringIoC容器将为每次请求创建一个新实例。如果将bean的配置改为:
<bean id="instanceFactoryInstance" factory-bean="myFactory" factory-method="createBeanClassInstance" scope="prototype"/>
则可以每次请求时都会创建一个新的实例。
Bean的生命周期
一个对象的生命周期包括创建(实例化和初始化),使用以及销毁等阶段,在Spring中,Bean对象周期也遵循这一过程,但是Spring提供许多对外的接口,允许开发者对3个过程(实例化,初始化,销毁)的前后做一些操作。在SpringBean中,实例化是为对象开辟空间,初始化则是对属性的初始化。
Spring容器可以管理singleton作用域Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁,而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean实例就交给了客户端的代码管理,Spring容器不再跟踪其生命周期,并且不会管理那些被配置成prototype作用域的Bean,Spring中的生命周期的执行是一个很复杂的过程,可借鉴Servlet的声明周期“实例化→初始化→接收请求→销毁”来理解Spring的声明周期。
Bean的生命周期整个过程如下:
- 根据Bean的配置情况实例化一个Bean
 - 根据Spring上下文对实例化的Bean进行依赖注入,即对Bean的属性进行初始化。
 - 如果Bean实现了
BeanNameAware接口,将调用它实现的setBeanName(String beanId)方法,此参数传递的是Spring配置文件中Bean的id。 - 如果Bean实现了
BeanFactoryAware接口,将调用它实现的setBeanFactory方法,此处传递的参数是当前Spring工厂实例的引用。 - 如果Bean实现了
ApplicationContextAware接口,将调用它实现的setApplicationContext(ApplicationContext)方法,此处参数传递的是Spring上下文实例的引用。 - 如果Bean关联了
BeanPostProcessor接口,将调用初始化方法postProcessBeforeInitialization(Object obj,String s)对Bean进行操作。 - 如果Bean实现了
InitalizingBean接口,将调用afterPropertiesSet方法。 - 如果Bean在Spring配置文件中配置了
init-method属性,将自动调用其配置的初始化方法。 - 如果Bean关联了
BeanPostProcessor接口,将调用postProcessAfterInitialzation(Object obj,String s)方法,由于是在Bean初始化结束后调用After方法,也可用于内存或缓存技术。 
以上工作完成后就可以使用该Bean,由于该Bean的作用域是singleton,所以调用的是同一个Bean实例。
- 当Bean不再需要时进入销毁阶段,如果Bean实现了
DisposableBean接口,则调用其实现的destroy方法将Spring中的Bean销毁。 - 如果在配置文件中通过
destroy-method属性指定了Bean的销毁方法,将调用其配置的销毁方法进行销毁。 
在Spring中,通过实现特定的接口或通过<bean>元素的属性设置可以对Bean的生命周期产生影响,开发者可以随意的配置属性,但是不建议过多的使用Bean实现接口,因为这样会使代码和Spring聚合较紧密。下面通过实例来演示Bean生命周期:
- 创建Bean的实现类
 
package life;
public class BeanLife {
    public void initMyself(){
        System.out.println(this.getClass().getName()+"执行自定义的初始化方法");
    }
    public void destroyMyself(){
        System.out.println(this.getClass().getName()+"执行自定义的销毁方法");
    }
}
- 在Spring的配置文件中创建一个Bean
 
<!--配置bean,使用init-method指定初始化方法,使用destroy-method指定销毁方法-->
<bean id="beanLife" class="life.BeanLife" init-method="initMyself" destroy-method="destroyMyself"/>
- 测试生命周期
 
package Test;
import life.BeanLife;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestLife {
    public static void main(String[] args) {
        //为了方便演示销毁方法,使用ClassPathXmlApplicationContext实现类声明容器。
        ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("获取对象之前");
        BeanLife beanLife=(BeanLife)ctx.getBean("beanLife");
        System.out.println("获取对象之后"+beanLife);
        ctx.close();
    }
}
Bean的装配方式
Bean的装配可以理解为将Bean依赖注入到Spring容器中,Bean的装配方式即Bean依赖注入的方式。Spring容器支持基于XML的装配、基于注解的装配以及自动装配方式,其中最受青睐的装配方式是基于注解的装配。
基于XML的配置方式的装配
基于XML的装配方式提供了两种方式,即使用构造方法注入和使用属性的setter方法注入。
在使用构造方法注入方式装配Bean时,Bean的实现类需要提供带参数的构造方法,并在配置方式中使用<bean>的子元素<construct-arg>来定义构造方法的参数,在使用属性的setter方法注入方式装配Bean时,Bean的实现类需要提供一个默认无参数的构造方法,并为需要注入的属性提供对应的setter方法,另外还需要使用<bean>元素的子元素<property>为每个属性注入值。
下面通过实例来演示基于XML配置的装配方式。
- 创建Bean的实现类
ComplexUser 
package assemble;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class ComplexUser {
    private String uname;
    private List<String> hobbyList;
    private Map<String,String> residenceMap;
    private Set<String> aliasSet;
    private String[] array;
    /**
     * 使用构造方法注入,需要提供带参数的构造方法
     * @param uname
     * @param hobbyList
     * @param residenceMap
     * @param aliasSet
     * @param array
     */
    public ComplexUser(String uname, List<String> hobbyList, Map<String, String> residenceMap, Set<String> aliasSet, String[] array) {
        this.uname = uname;
        this.hobbyList = hobbyList;
        this.residenceMap = residenceMap;
        this.aliasSet = aliasSet;
        this.array = array;
    }
    /**
     * 使用属性的setter方法注入,提供默认无参构造方法,并为注入的属性提供setter方法
     */
    public ComplexUser() {
    }
    public void setUname(String uname) {
        this.uname = uname;
    }
    public void setHobbyList(List<String> hobbyList) {
        this.hobbyList = hobbyList;
    }
    public void setResidenceMap(Map<String, String> residenceMap) {
        this.residenceMap = residenceMap;
    }
    public void setAliasSet(Set<String> aliasSet) {
        this.aliasSet = aliasSet;
    }
    public void setArray(String[] array) {
        this.array = array;
    }
    @Override
    public String toString() {
        return "ComplexUser{" +
                "uname='" + uname + '\'' +
                ", hobbyList=" + hobbyList +
                ", residenceMap=" + residenceMap +
                ", aliasSet=" + aliasSet +
                ", array=" + Arrays.toString(array) +
                '}';
    }
}
- 配置Bean,在Spring配置文件中使用
ComplexUser配置Bean的两个实例 
<!--使用构造方法注入方式装配ComplexUser实例user1-->
<bean id="user1" class="assemble.ComplexUser">
    <constructor-arg index="0" value="chenheng1"/>
    <constructor-arg index="1">
        <list>
            <value>唱歌</value>
            <value>跳舞</value>
            <value>爬山</value>
        </list>
    </constructor-arg>
    <constructor-arg index="2">
        <map>
            <entry key="dalian" value="大连"/>
            <entry key="beijing" value="北京"/>
            <entry key="shanghai" value="上海"/>
        </map>
    </constructor-arg>
    <constructor-arg index="3">
        <set>
            <value>chenheng100</value>
            <value>chenheng101</value>
            <value>chenheng102</value>
        </set>
    </constructor-arg>
    <constructor-arg index="4">
        <array>
            <value>aaa</value>
            <value>bbb</value>
        </array>
    </constructor-arg>
</bean>
<!--使用构造方法注入方式装配ComplexUser实例user2-->
<bean id="user2" class="assemble.ComplexUser">
    <constructor-arg index="0" value="chenheng2"/>
    <constructor-arg index="1">
        <list>
            <value>看书</value>
            <value>学习</value>
        </list>
    </constructor-arg>
    <constructor-arg index="2">
        <map>
            <entry key="shenzhen" value="深圳"/>
            <entry key="guanzhou" value="广州"/>
            <entry key="tianjin" value="天津"/>
        </map>
    </constructor-arg>
    <constructor-arg index="3">
        <set>
            <value>chenheng103</value>
            <value>chenheng104</value>
            <value>chenheng105</value>
        </set>
    </constructor-arg>
    <constructor-arg index="4">
        <array>
            <value>ccc</value>
            <value>ddd</value>
        </array>
    </constructor-arg>
</bean>
- 测试基于XML的装配方式
 
package Test;
import assemble.ComplexUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAssemble {
    public static void main(String[] args) {
        ApplicationContext appCon = new ClassPathXmlApplicationContext("applicationContext.xml");
        //使用构造方法装配测试
        ComplexUser u1=(ComplexUser)appCon.getBean("user1");
        System.out.println(u1);
        //使用setter方法装配测试
        ComplexUser u2=(ComplexUser)appCon.getBean("user2");
        System.out.println(u2);
    }
}
基于注解的装配
在Spring框架中,尽管使用XML配置文件可以简单地装配Bean,但如果应用中有大量的Bean需要装配,会导致XML配置文件过于庞大,不方便维护,因此更多时候我们建议使用注解配置。
在Spring框架中定义了一系列的注解,下面介绍几个常用的注解。
@Component:该注解是一个泛化的概念,仅仅表示一个组件对象(Bean)。可以作用在任何层次上,下面通过一个实例解释@Component。- 创建一个Bean
 
package annotation;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component()
/** 相当于@Component(“annotationUser”)或@Component(value = “annotationUser”),
* annotationUser为Bean的id,默认为首字母小写的类名 **/
public class AnnotationUser {
@Value("chenheng") //只注入了值,对于复杂的注入目前使用该方式无法解决。
private String uname;
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
- 配置注解:现在有了Bean的实现类,但还无法测试,因为Spring容器并不知道去哪里找Bean对象。需要在配置文件中配置注解,方式如下:
<context:component-scan base-package="bean所在的包"/>,因此创建配置文件annotationContext.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">
<context:component-scan base-package="annotation"/>
</beans>
- 测试Bean实例
 
package Test;
import annotation.AnnotationUser;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestAnnotation {
public static void main(String[] args) {
ApplicationContext appCon = new ClassPathXmlApplicationContext("annotationContext.xml");
AnnotationUser annotationUser = (AnnotationUser)appCon.getBean("annotationUser");
System.out.println(annotationUser);
}
}
在Spring4.0以上,配置注解指定包中的注解进行扫描需要事先导入SpringAOP的jar包。
@Repository:该注解用于将数据访问层(DAO)的类标识为Bean,即注解数据访问层Bean,其功能与@Compoent相同。@Service:该注解用于标注一个业务逻辑层组件,其功能与@Compoent相同。@Autowired:该注解对类成员变量、方法及构造函数进行标注,完成自动装配的工作,通过使用@Autowired来消除setter和getter方法,默认按照Bean的类型进行装配。
默认按照bean类型注入,意思是不需要写property属性,直接按照名称向类成员变量、方法及构造函数注入。
@Controller:该注解用于标注一个控制器组件类,其功能与@Compoent相同。@Resource:该注解与@Autowired的功能一样,区别在于该注解是按照名称来进行装配注入的,只有当找不到与名称匹配的Bean时才会按照类型来装配注入。而@Autowired默认是按照Bean的类型进行装配,如果想按照名称来装配,则需要与@Qualifier注解一起使用。
@Resource有两个属性——name和type,name属性指定的是Bean实例的名称,即按照名称注入,type指定的是Bean类型,即按照Bean的类型进行装配。
@Qualifier:该注解与@Autowired配合使用,当@Autowired注解需要按照名称来装配注入时需要和该注解一起使用,Bean的实例名称由@Qulifier注解的参数指定。
在上面的几个注解中,@Controller,@Repository,@Service的功能与@Compoent一样,但是为了让类的标注更加清晰,在开发中推荐使用@Repository标注数据访问层(DAO层),@Service标注业务逻辑层(Service层),@Controller标注控制器层(控制层)。
下面通过实例使用注解:
- 创建Dao层接口
TestDao 
package annotation.dao;
public interface TestDao {
    public void save();
}
- 实现TestDao接口
TestDaoImpl 
package annotation.dao.Impl;
import annotation.dao.TestDao;
import org.springframework.stereotype.Repository;
@Repository("testDao")
/**相当于@Repository,但如果在service中使用@Resource(name="testDao")时,不能省略testDao*/
public class TestDaoImpl implements TestDao {
    @Override
    public void save() {
        System.out.println("testDao save");
    }
}
- 创建Service接口TestService
 
package annotation.Service;
public interface TestService {
    public void save();
}
- 实现Service接口TestServiceImpl
 
package annotation.Service.Impl;
import annotation.Service.TestService;
import annotation.dao.TestDao;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
@Service("testService") //相当于testService
public class TestServiceImpl implements TestService {
    @Resource(name = "testDao")//相当于使用@Autowired。按照类型装配
    private TestDao testDao;
    @Override
    public void save() {
        testDao.save();
        System.out.println("testService save");
    }
}
- 创建Controller类
 
package annotation.Controller;
import annotation.Service.TestService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
@Controller
public class TestController {
    @Autowired
    private TestService testService;
    public void save(){
        testService.save();
        System.out.println("testController save");
    }
}
- 配置注解
 
<?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">
    <context:component-scan base-package="annotation"/>
</beans>
- 创建测试类
 
package Test;
import annotation.Controller.TestController;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestMoreAnnoation {
    public static void main(String[] args) {
        ApplicationContext appCo=new ClassPathXmlApplicationContext("annotationContext.xml");
        TestController testController = (TestController)appCo.getBean("testController");
        testController.save();
    }
}
												
											Spring Bean详解的更多相关文章
- Spring Bean 详解
		
Spring Bean 详解 Ioc实例化Bean的三种方式 1 创建Bean 1 使用无参构造函数 这也是我们常用的一种.在默认情况下,它会通过反射调⽤⽆参构造函数来创建对象.如果类中没有⽆参构造函 ...
 - Spring(3)——装配 Spring Bean 详解
		
装配 Bean 的概述 前面已经介绍了 Spring IoC 的理念和设计,这一篇文章将介绍的是如何将自己开发的 Bean 装配到 Spring IoC 容器中. 大部分场景下,我们都会使用 Appl ...
 - Spring二 Bean详解
		
Bean详解 Spring框架的本质其实是:通过XML配置来驱动Java代码,这样就可以把原本由java代码管理的耦合关系,提取到XML配置文件中管理.这样就实现了系统中各组件的解耦,有利于后期的升级 ...
 - (转)java之Spring(IOC)注解装配Bean详解
		
java之Spring(IOC)注解装配Bean详解 在这里我们要详细说明一下利用Annotation-注解来装配Bean. 因为如果你学会了注解,你就再也不愿意去手动配置xml文件了,下面就看看 ...
 - spring在IoC容器中装配Bean详解
		
1.Spring配置概述 1.1.概述 Spring容器从xml配置.java注解.spring注解中读取bean配置信息,形成bean定义注册表: 根据bean定义注册表实例化bean: 将bean ...
 - spring配置文件详解--真的蛮详细
		
spring配置文件详解--真的蛮详细 转自: http://book.51cto.com/art/201004/193743.htm 此处详细的为我们讲解了spring2.5的实现原理,感觉非常 ...
 - 【转载】Spring AOP详解 、 JDK动态代理、CGLib动态代理
		
Spring AOP详解 . JDK动态代理.CGLib动态代理 原文地址:https://www.cnblogs.com/kukudelaomao/p/5897893.html AOP是Aspec ...
 - J2EE进阶(四)Spring配置文件详解
		
J2EE进阶(四)Spring配置文件详解 前言 Spring配置文件是用于指导Spring工厂进行Bean生产.依赖关系注入(装配)及Bean实例分发的"图纸".Java EE程 ...
 - spring事务详解(二)简单样例
		
系列目录 spring事务详解(一)初探事务 spring事务详解(二)简单样例 spring事务详解(三)源码详解 spring事务详解(四)测试验证 spring事务详解(五)总结提高 一.引子 ...
 
随机推荐
- 重写Laravel异常处理类
			
现在开发前后端分离变得越来越流行了,后端只提供接口返回json格式的数据,即使是错误信息也要以json格式来返回,然而目前无论是Laravel框架还是ThinkPHP框架,都只提供了返回json数据的 ...
 - 最火的分布式调度系统 XXL-JOB 安装和简单使用
			
唉,在谈文章之前先说一下自己的情况.原计划是在上周六写完这篇文章的,然而周六的时候打开电脑的,按照平常"惯例",先补一些 "黑色五叶草"/"进巨&qu ...
 - Attention & Transformer
			
Attention & Transformer seq2seq; attention; self-attention; transformer; 1 注意力机制在NLP上的发展 Seq2Seq ...
 - js深克隆与浅克隆
			
定义: 浅克隆: 克隆对象的一层属性, 如果对象还有对象的话,里面的对象没有进行克隆,只是把地址给了别人.也可以理解为只是简单的克隆了躯体,但是没有得到其灵魂: 深克隆:克隆对象的多层属性,对象里面还 ...
 - 使用shell发送邮件,方便快捷
			
目录 前言 鉴赏代码 总结 前言 很多时候我们需要发送邮件,比如定时任务,比如邮件验证码等等. 各大编程语言都可以实现发送邮件功能,但还是太麻烦了,所以通过tcpdump抓包发现smtp发送邮件原理还 ...
 - java连接mysql数据查询数据
			
package com.cn.peitest.connectDatabase; import java.sql.Connection; import java.sql.DriverManager; i ...
 - Scrum转型(二) Scrum的角色
			
1.1 ScurmMaster 作为Scrum流程的捍卫者和布道者,ScrumMaster在Scrum团队中起到至关重要的作用,他们确保团队使用正确的流程,确保团队正确地召开各种会议,他们训练团队的敏 ...
 - Unity Package Manager
			
(注:Unity 2018.1及以后的版本才可以使用Package Manager.) 一个package是一个容器,里面放的是Assets, Shaders, Textures, plug-ins, ...
 - 两个字搞定DDD(领域驱动设计),DDD脱水版(一)修订版
			
摘自微信公众号丁辉的软件架构说
 - Android ADB原理及常用命令
			
Android调试桥(ADB, Android Debug Bridge)是一个Android命令行工具,包含在SDK 平台工具包中,adb可以用于连接Android设备,或者模拟器,实现对设备的控制 ...