使用构造函数注入进行Spring Auto Components扫描
我知道如何单独使用Auto Components Scanning和Consctuctor Injection。 http://www.mkyong.com/spring/spring-auto-scanning-components/ http://www.dzone.com/tutorials/java/spring/spring-bean-constructor-injection-1.html
是否可以将AutoComponent Scanning与构造函数注入一起使用? 使用自动组件扫描弹簧框架扫描时,所有类都指向"base-package"
并通过调用每个没有参数的构造函数来创建每个类的实例。 让我们说如何修改以下类和相关的spring XML文件。
package com.fb.common; @Repository public class Person { private String name; private int age; public Person(String name, int age){ this.name=name; this.age=age; } public String toString(){ return "Name: "+name+" Age:"+age; } }
XML文件
<!-- -->
您可以执行以下操作
@Inject // or @Autowired public Person(@Value("DefaultName") String name, @Value("30") int age){ this.name=name; this.age=age; }
根据Bozho 在这里的回答, spring在构造函数注入时皱眉 。 也许你不应该这样做。
对于你的问题的评论,它应该在
org.springframework spring-context ${org.springframework-version}
对于@Inject
,你需要
javax.inject javax.inject 1
但你可以使用Spring提供的@Autowired
。
您需要将@Value注释添加到每个构造函数参数中
public Person(@Value("DefaultName")String name, @Value("30")int age){ this.name=name; this.age=age; }
您可以使用属性占位符来引用属性文件中定义的属性,而不是对值进行硬编码。
public Person(@Value("${person.defaultName}")String name, @Value("${person.age}")int age){ this.name=name; this.age=age; }
像Person(实体值对象)这样的类通常不会被创建为spring bean。
如果启用了组件扫描,spring将尝试创建一个bean,即使已经在spring config xml中定义了该类的bean。 但是,如果spring配置文件中定义的bean和自动发现的bean具有相同的名称,则spring在进行组件扫描时不会创建新的bean。 如果bean没有no-args构造函数,则至少有一个构造函数必须自动连接。 如果没有构造函数是自动连接的,spring将尝试使用默认的no-args构造函数创建一个对象。 您可以在此处找到有关此主题的更多信息