这篇文章记录Spring IoC通过注解注入属性的方法。
注意,在第一步必须要引入context约束,否则无法出现context标签。
@Component("user")
public class User {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
ApplicationContext act = new ClassPathXmlApplicationContext("beans-ioc.xml");
User user = (User) act.getBean("user");
System.out.println(user);
@Component是Spring提供的通用的组件注解。@Component、@Controller、@Service和@Repository功能一样,可以互换,我们使用不同注解主要为了区分被注解的类处在不同的业务层,使逻辑更加清晰。这四个注解主要是定义bean,创建bean。
它们使用方法:
(1)标注在类上
(2)@Component("name")等于@Component(value="user")
(3)@Component相当于@Component("className")
例如,为上面案例中User类中id和name一个初始值,我们可以在id和name属性上面使用@Value注解,也可以在它们的set方法上使用@Value注解
@Component(value="user")
public class User {
@Value("1")
private Integer id;
@Value("lzgsea")
private String name;
public Integer getId() {
return id;
}
//@Value("1")
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
//@Value("lzgsea")
public void setName(String name) {
this.name = name;
}
}
public class UserTest {
@Resource(name = "user")
private User user;
}
public class UserTest {
// 按名注入,需要组件设置名称
// @Resource(name = "user")
// 和上面功能一样,按名注入
@Qualifier("user")
@Autowired
private User user;
}
Bean的范围的注解:默认是单例的。
@Scope :在类上添加的,控制类生成的时候采用单例还是多例。
@Scope取值:
@PostConstruct :相当于init-method
@PreDestroy :相当于destroy-method
这两注解用在方法上面。
@PostConstruct
public void init() {
System.out.println("初始化方法......");
}
@PreDestroy
public void destroy() {
System.out.println("销毁方法......");
}
配置
配置
在说明这两个子标签前,先说一下
use-default-filter此时为true那么会对base-package包或者子包下的所有的进行java类进行扫描,并把匹配的java类注册成bean。
可以发现这种扫描的粒度有点太大,如果你只想扫描指定包下面的Controller,该怎么办?此时子标签
这样就会只扫描base-package包或者子包下所有@Controller下的java类,并注册成bean。
use-dafault-filter在上面并没有指定,默认就为true,或者直接use-dafault-filter改为true,那么会对base-package包或者子包下的所有的进行java类进行扫描。
此时,spring不仅扫描了@Controller,还扫描了指定包所在的子包service包下注解@Service的java类。此时指定的include-filter不任何起到作用。
另外在我参与的项目中可以发现在base-package指定的包中有的子包是不含有注解了,所以不用扫描,此时可以指定
综合以上说明:
use-default-filters="false"的情况下不会自动扫描,需要配置
use-dafault-filters="false"的情况下:
use-default-filters="true"的情况下: