1.创建配置类
/**
* 完全注解方式: 配置类
* Configuration:替换xml的注解
* ComponentScan:替换扫描的配置
* basePackages = {"这里面写包的路径"}
* 附加:
* @ComponentScan("test10month.test1012")
* 里面可以省略就写路径也可以
*/
@Configuration
@ComponentScan(basePackages = {"test10month.test1012"})
@ComponentScan("test10month.test1012")
class SpringConfig {
}
2.类
@Component
class AttributeSpringClass {
/**
* 功能描述:注入对象时使用
* Autowired:根据属性类型自动装配
* Qualifier:根据属性名称注入
* 当有接口多个实现类的时候,不能仅仅通过Autowired自动装配,会识别不了准确的名称
* 就需要使用Qualifier去指定类名称(首字母小写)
* @Qualifier("attributeSpring") ;也可以直接写,不用写value
* 方法参数描述:无
*/
@Autowired
@Qualifier(value = "attributeSpring")
@Qualifier("attributeSpring")
private AttributeSpringInterface attributeSpringInterface;
/**
* Value:注入string时使用
*/
@Value("这是string")
private String string;
public void rod() {
System.out.println("这是rod");
System.out.println(string);
attributeSpringInterface.testinterface();
}
}
interface AttributeSpringInterface {
/**
* 接口
*/
void testinterface();
}
/**
* 实现接口时最好加上具体name
*/
@Component("attributeSpring")
class AttributeSpring implements AttributeSpringInterface {
@Override
public void testinterface() {
System.out.println("属性注入测试1");
}
}
@Component("attributeSpring2")
class AttributeSpring2 implements AttributeSpringInterface {
@Override
public void testinterface() {
System.out.println("属性注入测试2");
}
}
3.测试类
package test10month.test1012;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
/**
* 功能描述:
* @version 1.0
* @className AttributeSpringTest
* @author: 罗德
* @create: 2020-10-12 20:12
*/
public class AttributeSpringTest {
public static void main(String[] args) {
/**
* 完全注解的方式需要使用AnnotationConfigApplicationContext(配置类.class)
*/
var context = new AnnotationConfigApplicationContext(SpringConfig.class);
var attributeSpringClass = context.getBean("attributeSpringClass", AttributeSpringClass.class);
attributeSpringClass.rod();
/**
* 这是rod
* 这是string
* 属性注入测试1
*/
}
}
4.附加:有参构造器注解的注入
将@Qualifier(“attributeSpring2”)放在形参的位置
@Autowired
public AttributeSpringClass(@Qualifier("attributeSpring2") AttributeSpringInterface attributeSpringInterface) {
this.attributeSpringInterface = attributeSpringInterface;
System.out.println("属性注入测试2的构造器");
}
构造器的执行在成员变量属性的执行前面,所以如果要使用构造器中的参数
就不需要在声明参数的地方继续加上注解
因为会把构造器注入的属性覆盖掉
声明参数的地方加注解,实际是注解内部调用了set的方法去把对象赋给对应的属性,而set方法是在构造器后才执行的
@Autowired
@Qualifier("attributeSpring")
private AttributeSpringInterface attributeSpringInterface;