声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 Spring使用注解配置依赖注入大部分情况下,使用Spring配置依赖注入时,都是使用注解来进行配置,因为注解比xml要方便和简单。不过类似于数据源对象这种配置信息容易变更的对象除外,这种对象使用xml文件来进行配置会更适合,方便于在外部进行修改,而不需要打开代码来进行修改。 接下来简单介绍一下注解的配置方式,首先要让Spring支持注解,编辑Spring配置文件内容如下: 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:p="http://www.springframework.org/schema/p"
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:annotation-config/>
<context:component-scan base-package="org.zero01"/>
beans>
通过注解配置来让Spring帮我们创建对象,Student类代码如下: package org.zero01;
import org.springframework.stereotype.Component;
@Component("stu")
public class Student {
...
测试代码: package org.zero01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu1 = (Student) app.getBean("stu");
Student stu2 = (Student) app.getBean("stu");
if (stu1 == stu2) {
System.out.println("单例对象");
}else{
System.out.println("非单例对象");
}
}
}
运行结果: 单例对象 使用注解时可以不配置id值,直接写上 @Component 也行: package org.zero01;
import org.springframework.stereotype.Component;
@Component
public class Student {
...
然后通过该类的class来获取实例对象: Student stu1 = app.getBean(Student.class);
但是这种方式的灵活性没有使用id值的方式好,因为字符串是可以通过变量改变的,而这种使用class的方式相当于是写死在代码上了。 如果不希望从容器里取出来的不是单例对象的话,可以使用 @Scope 注解来配置指定使用原型模式,需要配置属性的值可以使用 @Value 注解进行配置,例如: package org.zero01;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Scope;
@Component("stu")
@Scope(value = "prototype")
public class Student {
@Value("小明")
private String name;
@Value("15")
private int age;
@Value("南京")
private String address;
...
测试代码: package org.zero01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu1 = app.getBean(Student.class);
Student stu2 = app.getBean(Student.class);
if (stu1 == stu2) {
System.out.println("单例对象");
}else{
System.out.println("非单例对象");
}
System.out.println(stu1.getName());
System.out.println(stu1.getAge());
System.out.println(stu1.getAddress());
}
}
运行结果: 非单例对象
小明
15
南京
注:我们可以将 @Value 注解写在属性的setter方法上,和写在属性上的作用是一样的。 如果需要注入自建类型,有两个注解可以做到,分别是 @Resource 和 @Autowired,但是要想通过这两个注解来配置依赖注入,被注入的对象需要写上 @Component 注解: package org.zero01;
import org.springframework.stereotype.Component;
@Component("phone")
public class Phone {
}
package org.zero01;
import org.springframework.stereotype.Component;
@Component("dog")
public class Dog {
}
然后才可以使用 @Resource 和 @Autowired 注解配置依赖注入,Student类代码: package org.zero01;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.context.annotation.Scope;
import javax.annotation.Resource;
@Component("stu")
@Scope(value = "prototype")
public class Student {
@Value("小明")
private String name;
@Value("15")
private int age;
@Value("南京")
private String address;
@Resource
private Dog dog;
@Autowired
private Phone phone;
...
测试代码: package org.zero01;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
Student stu1 = app.getBean(Student.class);
System.out.println(stu1.getName());
System.out.println(stu1.getAge());
System.out.println(stu1.getAddress());
System.out.println(stu1.getDog());
System.out.println(stu1.getPhone());
}
}
运行结果: 小明
15
南京
org.zero01.Dog@47db50c5
org.zero01.Phone@5c072e3f
@Autowired 和 @Resource的区别简述:用途:做bean的注入时使用 历史:@Autowired 属于Spring的注解,@Resource 不属于Spring的注解,是JDK1.6支持的注解 共同点:装配bean. 写在字段上,或写在setter方法 不同点: @Autowired 默认按类型装配,依赖对象必须存在,如果要允许null值,可以设置它的required属性为false,例如:@Autowired(required=false),也可以使用名称装配,配合 @Qualifier 注解。 @Resource 是JDK1.6支持的注解,默认按照名称进行装配,名称可以通过name属性进行指定,如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找,如果注解写在setter方法上默认取属性名进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。 便利程度:两者的便利程度都差不多,都可以实现自动装配 耦合问题:可能会有人说使用Java自带的 @Resource 可以降低与Spring的耦合,但实际上注解处理器我们使用的是Spring提供的,是一样的,无所谓解耦不解耦的说法 |