组件扫描:Spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。
特定组件包括:
1、@Component:基本注解,识别一个受Spring管理的组件
2、@Respository:标识持久层组件
3、@Service:标识业务层组件
4、@Controller:标识表现层组件
Spring 有默认的命名策略: 使用非限定类名, 第一个字母小写. 也可以在注解中通过 value 属性值标识组件的名称
当在组件类上使用了特定的注解之后, 还需要在 Spring 的配置文件中声明<context:component-scan> :
1、base-package 属性指定一个需要扫描的基类包,Spring 容器将会扫描这个基类包里及其子包中的所有类.
2、当需要扫描多个包时, 可以使用逗号分隔.
3、<context:include-filter />和<context:exclude-filter />
<!-- 扫描@Controller注解 -->
<context:component-scan base-package="com.hzg.controller" use-default-filters="false">
<context:include-filter type="annotation"expression="org.springframework.stereotype.Controller" />
</context:component-scan> <!-- 配置扫描注解,不扫描@Controller注解 -->
<context:component-scan base-package="com.hzg.controller">
<context:exclude-filter type="annotation"expression="org.springframework.stereotype.Controller" />
</context:component-scan>
当使用<context:include-filter />的时候,在<context:component-scan >里必须加上use-default-filters="false",否则不起作用。
其中属性expression的值不是你的包所在位置,别搞错了,它是你注解的具体类地址。
实例:
创建包com.hzg.anotation
创建包com.hzg.anotation.controller
创建UserController类
@Controller
public class UserController { @Autowired(required = false)
private UserService userService;
//@Autowired也可以放在setter方法上,那就去掉上面的Autowired注解
public void setUserService(UserService userService) {
this.userService = userService;
} public void excute(){
System.out.println("UserController excute");
userService.diao();
}
}
创建包com.hzg.anotation.service
创建UserService类
@Service
public class UserService { @Autowired
private UserRepostory userRepostory;
public void diao(){
System.out.println("UserService diao");
userRepostory.save();
}
}
创建包com.hzg.anotation.repostory
创建UserRepostory接口
public interface UserRepostory {
void save();
}
创建UserRepostoryImlp类
@Repository("userRepostory")
public class UserRepostoryImlp implements UserRepostory { @Override
public void save() {
System.out.println("UserRepostory save");
}
}
创建configautowire.xml文件
<context:component-scan base-package="com.hzg.anotation"></context:component-scan>
Main方法
public static void main(String[] args) {
2 ApplicationContext ctx = new ClassPathXmlApplicationContext("configautowire.xml");
3 UserController userController = (UserController) ctx.getBean("userController");
4 userController.excute();
}
输出接口:
UserController excute
UserService diao
UserRepostory save
其中:
1、@Autowired(required = false)中required = false的意思是:如果没有这个类的实例化,那么会赋值成NULL,而不是报错。
2、@Autowired注解可以为成员变量、方法、构造函数赋值。
3、@Repository("userRepostory")等同于@Repository(value = "userRepostory"),value是默认值,代表给这个Bean
赋值了id的值,防止有重复的Bean。
4、如果在UserService类的@Autowired下面使用限定修饰符@Qualifier("userRepostoryImlp"),那么
@Repository("userRepostory")必须写成@Repository或者写成@Repository("userRepostoryImlp"),否则就有歧义了。
------------------------------------------------------------------------------------------------------------------------