最简单的配置
<?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"
xmlns:mvc="http://www.springframework.org/schema/mvc"
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-4.2.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
<!-- 扫描注解 -->
<context:component-scan base-package="org.foo"/>
</beans>
入口方法:
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class SpringEntrance {
public static void main(String[] args){
ClassPathXmlApplicationContext resource = new ClassPathXmlApplicationContext(
new String[]{ "applicationContext.xml"});
}
}
项目结构:
src
└── main
└── java
├── applicationContext.xml
└── org
└── foo
├── service
│ ├── TestDemo.java
│ └── Test.java
└── SpringEntrance.java
//项目一启动就产生一个且仅一个实例,即单例。
//并且,通过 @Autowired 只能获得这个单例。new Test()则不受单例限制
@Component
public class Test{
}
//项目启动时不加载
@Lazy
@Component
public class Test{
}
package org.foo.service;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestDemo {
@Autowired
BeanFactory beanFactory;
public void doSth(){
//只有运行到这里 Test 类才被实例化,延迟加载成功
TestSingle ts=(TestSingle) beanFactory.getBean("test");
}
}
//每个@Autowired 生成一个实例,可以有多个实例
@Scope("prototype")
//@Lazy
//无论加不加@Lazy,被@Scope("prototype")修饰的类都会懒加载。
@Component
public class Test{
}
调用
package org.foo.service;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestDemo {
// 一般禁止使用 @Autowired 标签加载@Lazy的类,此时懒加载效果就没有了
// @Autowired
// TestSingle testSingle;
//通过 BeanFactory 接口创建实例
@Autowired
BeanFactory beanFactory;
public void doSth(){
Test test = null;
for(int i=0;i<10;i++) {
//test 是 Test 类名首字母小写!一定要首字母小写!
//只有运行到这里 Test 类才被实例化,延迟加载成功
test = (Test) beanFactory.getBean("test");
}
}
}
spring beanfactory类高级用法:反射方式加载类
beanFactory.getBean(
task.getHandler() + "UrlSpider", // 反射获得子类
AbstractUrlSpider.class ); // 返回父类型
需要注意的问题:构造函数里不支持 @Autowired 的实例
package org.foo.service;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class TestDemo {
@Autowired
BeanFactory beanFactory;
public TestDemo (){
beanFactory.getBean("test",Test.class);
}
}