最近在学习Spring中的容器相关的知识和源码,特此记录下来。
准备工作:创建一个maven项目
next
finish. ok项目创建完成。
导入Spring的maven依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.12.RELEASE</version>
</dependency>
新建bean类Person,代码如下
package com.herman.bean;
public class Person {
private String name;
private Integer age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
public Person() {
super();
}
}
好了,准备工作到此就ok了。
Spring中加入Bean的7中方式如下:
第一种:xml中配置
很古老的一种方式,刚开始学习spring的时候应该就是这种吧。
首先,在类路径下新建beans.xml,结构如下:
beans.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="person" class="com.herman.bean.Person">
<property name="name" value="herman"></property>
<property name="age" value="18"></property>
</bean>
</beans>
测试类如下:
package com.herman;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.herman.bean.Person;
public class MainTest {
public static void main(String[] args) {
/**
* ClassPathXmlApplicationContext
* 顾名思义:ClassPath下的一个Xml,传入我们的beans.xml即可。
*/
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");
Person person = (Person) applicationContext.getBean("person");
System.out.println(person);
}
}
输出结果:
第二种:利用@Bean注解
新建一个MainConfig,如下:
package com.herman.config;
import java.util.Arrays;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.herman.bean.Person;
/**
* @author Herman
*
* 添加了@Configuration注解的意思就是告诉Spring这个类是一个配置类
* 配置类的方式等同于配置文件(配置类==配置文件)
*/
@Configuration
public class MainConfig {
/**
* 这里可以对比一下配置文件的写法
*
* <bean id="person" class="com.herman.bean.Person">
* <property name="name" value="herman"></property>
* <property name="age" value="18"></property>
* </bean>
*
*/
/**
* @Bean就是给容器中注册一个Bean;类型为方法的返回类型(Person),id默认是方法名person
*
* 此处@Bean里面可以指定返回的id名
* 例如 @Bean("herman001") 那么 加入到ioc中的这个Person类型的Bean id叫做 herman001
* 所以 String[] names = applicationContext.getBeanNamesForType(Person.class);
* System.out.println(Arrays.asList(names));
* 输出结果时候 [herman001]
* 也可以修改方法名 public Person person002() { 效果是一样的。
*
* 但是如果同时添加了@Bean("herman001") 和 public Person person002() ,
* 默认是herman001,也就是@Bean 占主导地位
*/
@Bean("herman001")
public Person person002() {
return new Person("张三",20);
}
}
然后测试类继续 如下:
package com.herman;
import java.util.Arrays;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import