一、简介
Spring2.5虽然支持注解,但是还是无法抛弃xml文件
二、环境准备
- 创建maven项目
- 添加依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.6.RELEASE</version>
</dependency>
- 在resources文件下创建XML文件spring_ioc.xml
配置扫描注解的路径
<context:component-scan base-package="cn.tedu">
</context:component-scan>
三、实例解析
1.实现依赖注入
- 基于注解方法进行依赖注入
@Component
public class User {
@Value("张三")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
创建测试类:
public class IocTest {
ClassPathXmlApplicationContext ioc;
@Before
public void before(){
ioc = new ClassPathXmlApplicationContext("spring_ioc.xml");
}
@Test
public void test(){
User user = ioc.getBean("user", User.class);
System.out.println(user);
}
}
- 引用外部资源文件,通过@Value注解来获取值
在xml文件中引入外部文件
<context:property-placeholder location="classpath:springIOC.properties" file-encoding="UTF-8"></context:property-placeholder>
创建springIOC.properties文件
spring.name=王二
在实体类中注入值
@Value("${spring.name}")
private String name;
这里有一个坑:因为这个类名是User,外部文件定义值的key如果用user.name,那么就取不到值。
- 通过SpEL表达式进行赋值
在user类中修改一下代码
@Value("#{student.name}")
private String name;
添加实体类Student,并注入到bean容器中
@Component
public class Student {
@Value("学生")
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
'}';
}
}
2.自动注入
@Autowired
private UserService userService;
通过@Autowired注解,实现自动注入
除了上面的注解外,还可以使用@Resource实现依赖注入,只是@Resource是JDK提供,而@Autowired是由spring提供
4.Bean的作用域
singleton:单例,只会在IOC容器中创建一次
prototype:多例,每次获取IOC容器都会new一个bean
在需要的类上添加如下注解:
@Scope("prototype")
5.生命周期回调
public class Student{
@PostConstruct
public void init(){
System.out.println("生命周期回调---初始化");
}
@PreDestroy
public void destroy(){
System.out.println("生命周期回调---销毁");
}
}
6.懒加载
//true:在使用时,才会加载
@Lazy(value = true)