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事务详解(五)总结提高 一.引子 ...
随机推荐
- vue第十五单元(熟练使用vue-router插件)
第十五单元(熟练使用vue-router插件) #课程目标 1.掌握路由嵌套 2.掌握导航守卫 #知识点 #一.路由嵌套 很多时候,我们会在一个视口中实现局部页面的切换.这时候就需要到了嵌套路由. 也 ...
- 群晖DS218+部署Harbor(1.10.3)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Promise 之初探
陈旧的知识应该更新一下了,先尝试一下 Promise ,主要参考 https://www.cnblogs.com/whybxy/p/7645578.html 定义一个函数 直接上干货,定义一个函数: ...
- 【electron+vue3+ts实战便笺exe】一、搭建框架配置
不要让自己的上限成为你的底线 前言 诈尸更新系列,为了跟上脚步,尝试了vue3,在学习vue3的时候顺便学习一手electron和ts,本教程将分别发布,源码会在最后的文章发布.因为还在开发中,目前也 ...
- App Shortcuts 快捷方式:Android 的 '3D Touch'
Hello Shortcuts 从Android7.1(API level25)开始,开发者可以为自己的app定制shortcuts.shortcuts使用户更便捷.快速的使用app.我个人感觉有点像 ...
- LeetCode数组移除数组中目标元素等题目
一种自己解题,一种高赞解题 /** * 移除数组中目标元素,返回新数组长度 * @param nums * @param val * @return */ public int removeEleme ...
- 返回前端页面的属性名称和实体类的名称不一致用@JsonProperty
场景:比如前端要求你返回一个json数据类型,但是这个json类型的里面属性有的值重复了,比如 { name:zhangsan, age:12, teacher:[ name:Mrs Liu subj ...
- java instanceof 判断是否是String
if(formbean.getBean().get("RZZGMCM") instanceof String){ formbean.getBean().put("RZZG ...
- CODING 静态网站服务升级,快速、稳定、高拓展!
CODING 静态网站拥有强大的页面托管服务,目前已有数万开发者.设计师.产品经理.团队与企业使用 CODING 静态网站托管了他(她)们的个人网站.博客.企业与产品官网.在线文档等.CODING 静 ...
- MM-RFQ询价报价
(1).询价报价单事务码:ME41/ME42/ME43 需要的主数据:采购组织.供应商.采购组,物料 (2)ME47:维护供应商的报价.可以用项目明细的条件对供应商的报价进行详细设置. (3)供应商价 ...