[Spring]@Autowired,@Required,@Qualifier注解

时间:2023-03-09 16:55:55
[Spring]@Autowired,@Required,@Qualifier注解

@Required注解

@Required注解用于setter方法,表明这个属性是必要的,不可少的,必须注入值

假设有个测试类,里面有name和password两个属性

我给两个属性的setter方法都加了@Required注解

package com.example.demo1.Implements;

import com.example.demo1.Interface.UserService;
import org.springframework.beans.factory.annotation.Required; public class UserClientImpl implements UserService { private String name;
private String password; public UserClientImpl(){} public UserClientImpl(String name,String password){
this.name = name;
this.password = password;
} public String getName() {
return name;
} @Required
public void setName(String name) {
this.name = name;
} public String getPassword() {
return password;
} @Required
public void setPassword(String password) {
this.password = password;
} @Override
public void save() {
System.out.println("客户端保存信息"+name+"--"+password);
}
}

现在我只给一个属性加注入,另一个不加

可以看到报错

[Spring]@Autowired,@Required,@Qualifier注解

然后我补上注入之后就没问题了

[Spring]@Autowired,@Required,@Qualifier注解

@Autowoired注解

其实看名字就可以看出来,这个是跟自动装填有关

使用它需要加一行代码

<bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcess></bean>

1,在属性前加此注解

先给定两个类

package com.example.demo1.Other;

public class CustomerTest {
public CustomerTest(){
System.out.println("在Customer.构造方法中...");
}
public void show(){
System.out.println("在Customer.show方法中...");
}
}
package com.example.demo1.Implements;

import com.example.demo1.Interface.Customer;
import com.example.demo1.Other.CustomerTest;
import org.springframework.beans.factory.annotation.Autowired; public class CustomerImpl implements Customer { private String name;
private String id;
@Autowired
private CustomerTest customerTest; public CustomerTest getCustomerTest() {
return customerTest;
} public void setCustomerTest(CustomerTest customerTest) {
this.customerTest = customerTest;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
} @Override
public void show() {
System.out.println(id+"..."+name);
customerTest.show();
}
}

第二个类在第三个成员变量前面加个此注解

然后applicationContext这样写

 <bean id="Customer"
class="com.example.demo1.Implements.CustomerImpl">
</bean>
<bean id="CustomerTest" class="com.example.demo1.Other.CustomerTest"></bean>

在打印一下结果

ApplicationContext instance = new ClassPathXmlApplicationContext("applicationContext.xml");
CustomerImpl customer = (CustomerImpl) instance.getBean("Customer");
customer.show();
((ClassPathXmlApplicationContext) instance).registerShutdownHook();

[Spring]@Autowired,@Required,@Qualifier注解可以看到Customer对象是自动装填了的

2,在构造函数之前加此注解

效果和上面是一样的,不演示了

3,@Autowired(required=false)的作用

这里跟之前的@Required的作用类似

默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的 (required=false) 选项关闭默认行为。

这里跟@Required的效果类似,不演示了

@Qualifier注解

在之前的学习注解的过程中,显然,用自动装配的时候,如果配置的bean是相同的类的生成的对象,会报错,于是为了解决这个问题,@Qualifier就出来了

@Qualifier和@Autowired一起使用,在@Qualifier后面的括号里欲装配的bean的名称,就可以让Spring自动给我们装配合适的bean

首先applicationContext.xml ,因为要用到context标签,需要用到aop.jar,所以在这之前记得引入Springframework-aop.jar,这个标签就像之前的注解一样,需要注册那几个Processor才能起作用

<?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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <context:annotation-config/>
<bean id="Profile" class="com.example.demo1.Testclass.Profile"></bean> <bean id="student1" class="com.example.demo1.Testclass.Student">
<property name="name" value="student1"></property>
<property name="age" value="2"></property>
</bean>
<bean id="student2" class="com.example.demo1.Testclass.Student">
<property name="age" value="3"></property>
<property name="name" value="student2"></property>
</bean>
</beans>

注解是放在要装配放属性的上方

package com.example.demo1.Testclass;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; public class Profile {
@Autowired
@Qualifier(value = "student1")
private Student student;
public Profile(){
System.out.println("Inside Profile constructor." );
}
public void setStudent(Student student) {
this.student = student;
} public void printAge() {
System.out.println("Age : " + student.getAge() );
}
public void printName() {
System.out.println("Name : " + student.getName() );
}
}
package com.example.demo1.Testclass;

public class Student {
private Integer age;
private String name;
public void setAge(Integer age) {
this.age = age;
}
public Integer getAge() {
return age;
}
public void setName(String name) {
this.name = name;
}
public String getName() {
return name;
}
}

之后Spring就会识别出合适的bean并注入了

测试代码

ApplicationContext instance = new ClassPathXmlApplicationContext("applicationContext.xml");
Profile profile = (Profile) instance.getBean("Profile");
profile.printName();
((ClassPathXmlApplicationContext) instance).registerShutdownHook();

结果也正是这样

[Spring]@Autowired,@Required,@Qualifier注解