1.依赖查找
-
- 根据 Bean 名称查找
- [实时查找]
- [延时查找]
-
- 根据 Bean 类型查找
- [单个 Bean 对象]
- [集合 Bean 对象]
-
- 根据 Bean 类型 + 名称查找
-
- 根据 Java 注解查找
新建一个工程,依赖spring-context
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
创建一个User类
package ioc;
public class User {
Long id;
String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + ''' +
'}';
}
}
新建META-INF/dependency-lookup.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
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id = "user" class="ioc.User">
<property name="id" value="1"/>
<property name="name" value="彭于晏"/>
</bean>
</beans>
byName实时依赖查找
/**
* 依赖查找例子
*/
public class DependencyLookupDemo {
public static void main(String[] args) {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
// 这里的 “user” 就是 xml 文件中的 id,即名称实时查找
User user = (User) beanFactory.getBean("user");
System.out.println(user);
}
}
byName延迟查找
// xml中添加
<bean id="objectFactory" class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
<property name="targetBeanName" value="user"/>
</bean>
// 延迟查找的例子
ObjectFactory<User> objectFactory = (ObjectFactory<User>) beanFactory.getBean("objectFactory");
User user = objectFactory.getObject();
System.out.println("延迟加载" + user);
byType 单个bean
// 单个bean对象
public static void lookUpByType() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
User bean = beanFactory.getBean(User.class);
System.out.println(bean);
}
byType 多个bean
存在集合bean
// 有多个bean对象的情况
public static void lookUpByTypeComplex() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
if(beanFactory instanceof ListableBeanFactory){
ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
Map<String, User> beansOfType = listableBeanFactory.getBeansOfType(User.class);
System.out.println("集合类型:" + beansOfType);
}
}
byAnnotation 通过注解
package ioc;
@DependencyLookupDemo.Super
public class SuperUser extends User {
private String address;
public SuperUser() {
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "SuperUser{" +
"address='" + address + ''' +
"} " + super.toString();
}
}
xml中添加bean的实现
<bean id="superUser" class="ioc.SuperUser" parent="user"
primary="true">
<property name="address" value="杭州"/>
</bean>
// 根据注解查找
public static void lookUpByAnnotation() {
BeanFactory beanFactory = new ClassPathXmlApplicationContext("classpath:/META-INF/dependency-lookup.xml");
if(beanFactory instanceof ListableBeanFactory){
ListableBeanFactory listableBeanFactory = (ListableBeanFactory)beanFactory;
Map<String, Object> beansOfType = listableBeanFactory.getBeansWithAnnotation(Super.class);
System.out.println("查找 @super 的:" + beansOfType);
}
}