bean 的定义基于注解的配置
自动扫描组件的注释类型
有 4 种注释类型,分别是:
- @Component ——表示一个自动扫描 component
- @Repository ——表示持久化层的 DAO component
- @Service ——表示业务逻辑层的 Service component
- @Controller ——表示表示层的 Controller component
在项目中,我们可以将所有自动扫描组件都用 @Component 注释,Spring 将会扫描所有用 @Component 注释过得组件。 实际上,@Repository 、 @Service 、 @Controller 三种注释是为了加强代码的阅读性而创造的
- @Autowired 注解,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
通过 @Autowired的使用来消除 set ,get方法。通过这个步骤,我们可以直接把bean的属性注入到这个变量里面了。
package com.anthony1314.spring.dao;
import org.springframework.stereotype.Component;
@Component
public class CustomerDAO {
@Override
public String toString(){
return "Hello , This is CustomerDAO";
}
}
package com.anthony1314.spring.services;
import com.anthony1314.spring.dao.CustomerDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class CustomerService {
@Autowired
CustomerDAO customerDAO;
@Override
public String toString() {
return "CustomerService [customerDAO=" + customerDAO + "]";
}
}
- @Qualifier 注解
与**@Autowired** 注解一起用,注入的过程做更多的控制,@Qualifier 可以帮助你指定做更详细配置。一般在两个或者多个 bean 是相同的类型,spring 在注入的时候会出现混乱。
<bean id="hello1" class="com.anthony1314.demo.service.HelloImpl1"/>
<bean id="hello2" class="com.anthony1314.demo.service.HelloImpl2"/>
import com.anthony1314.demo.service.Hello;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath*:SpringBeans.xml"})
public class HelloTest {
@Autowired
@Qualifier("hello1")
private Hello hello;
@Test
public void sayHello(){
hello.sayHello();
}
}
- @Required
为了保证所对应的属性必须被设置,@Required 注解应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
import org.springframework.beans.factory.annotation.Required;
public class Dog {
private Person person;
private String name;
public Person getPerson() {
return person;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Required
public void setPerson(Person person) {
this.person = person;
}
@Override
public String toString() {
return "Dog{" +
"person=" + person +
", name='" + name + '\'' +
'}';
}
}
<bean id="personBean" class="com.anthony1314.spring.bean.Person">
<property name="name" value="jack"/>
<property name="age" value="18"/>
</bean>
<bean id="dogBean" class="com.anthony1314.spring.bean.Dog">
<property name="name" value="tom"/>
<property name="person" ref="personBean"/>
</bean>
我发现在spring 5.0多版本的时候@Required注解idea自动就禁用了,然后用4.0多版本就不禁用,我猜spring5.0版本自动检测不用自己设置注解之类的
自动扫描
<context:component-scan base-package="com.anthony1314.spring"/>
xml 文件中,加入了 context:component-scan 标签,beans 中也加入了标签,这样就将 Spring 的自动扫描特性引入, base-package 表示组件的存放位置,Spring 将扫描对应文件夹下的 bean(用 @Component 注释过的),将这些 bean 注册到容器中。