一:在classpath中扫描组件
1.组件扫描(component scanning):spring能够从classpath下自动扫描,侦测和实例化具有特定注解的组件。
2.特定的组件包括:
- @Component:基本注解,标识了一个受spring管理的组件。
- @Repository:标识持久层组件
- @Service:标识服务层(业务层)组件
- @Controller:标识表现层组件
3.对于扫描到的组件,spring有默认的命名策略,使用非限定类名,第一个字母小写,也可以在注解中通过value属性值标识组件的名称。(例子 UserController的bean名称就是userController,可以通过形式赋值@Repository("userRepository"))
二:注解属性配置
1.当在组件类中使用了特定的注解之后,还需要在spring中配置文件中声明context:component-scan(注意要先导入命名空间context)
- base-package:指定一个需要扫描的基类包,spring容器将会扫描这个基类包里以及子包中的所有类,当需要扫描多个包时,可以使用逗号分隔。
- 如果仅希望扫描特定的类而非基包下的所有类,可以使用resource-pattern属性过滤特定的类
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!--导入context命名空间 --> <!-- 指定spring IOC容器扫描的包 --> <!-- 可以通过resource-pattern指定扫描的资源 --> <context:component-scan base-package="com.dhx.annotation" resource-pattern="repository/*.class"> </context:component-scan> </beans>
- context:include-filter:子节点表示要包含的目标类,通过要配合 use-default-filters配合使用
- context:exclude-filter 子节点表示要排除在外的目标类
- context:component-scan下可以拥有若干个context:include-filter和context:exclude-filter子节点
三:代码实现
1.创建一个TestObject类并加上@Component注解
package com.dhx.annotation;
import org.springframework.stereotype.Component;
@Component
public class TestObject {
}
2.创建一个UserController类并加上@Controller注解
package com.dhx.annotation.controller;
import org.springframework.stereotype.Controller;
@Controller
public class UserController {
public void execute() {
System.out.println("UserController Execute ...");
}
}
3. 创建一个UserRepository接口,实现这个类并加上@Repository注解
package com.dhx.annotation.repository;
public interface UserRepository {
void save();
}
package com.dhx.annotation.repository;
import org.springframework.stereotype.Repository;
@Repository("userRepository")//spring bean的名称
public class UserRepositoryimpl implements UserRepository {
@Override
public void save() {
System.out.println("UserRepository Save ...");
}
}
4. 创建一个UserService类,并加上注解@Service
package com.dhx.annotation.service;
import org.springframework.stereotype.Service;
@Service
public class UserService {
public void add() {
System.out.println("UserService add ...");
}
}
5.配置XML文件,要导入context命名空间
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<!--导入context命名空间 -->
<!-- 指定spring IOC容器扫描的包 -->
<!-- 可以通过resource-pattern指定扫描的资源 -->
<!--
<context:component-scan base-package="com.dhx.annotation"
resource-pattern="repository/*.class">
</context:component-scan>
-->
<!--context:exclude-filter 子节点指定排除那些指定表达式的组件
annotation:注解类型
-->
<!--
<context:component-scan base-package="com.dhx.annotation">
<context:exclude-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
-->
<!--context:include-filter 子节点指定包含那些指定表达式的组件,该子节点需要 use-default-filters配合使用-->
<!--
<context:component-scan base-package="com.dhx.annotation"
use-default-filters="false">
<context:include-filter type="annotation"
expression="org.springframework.stereotype.Repository"/>
</context:component-scan>
-->
<!-- assignable:指定的类型 -->
<!--
<context:component-scan base-package="com.dhx.annotation">
<context:exclude-filter type="assignable"
expression="com.dhx.annotation.service.UserService"/>
</context:component-scan>
-->
<!-- assignable:指定的类型 -->
<context:component-scan base-package="com.dhx.annotation"
use-default-filters="false">
<context:include-filter type="assignable"
expression="com.dhx.annotation.service.UserService"/>
</context:component-scan>
</beans>
6.测试
package com.dhx.annotation;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.dhx.annotation.controller.UserController;
import com.dhx.annotation.repository.UserRepository;
import com.dhx.annotation.repository.UserRepositoryimpl;
import com.dhx.annotation.service.UserService;
public class Main {
public static void main(String[] args) {
ApplicationContext ctx=new ClassPathXmlApplicationContext("beans-annotation.xml");
TestObject to=(TestObject) ctx.getBean("testObject");
System.out.println(to);
UserController userController=(UserController) ctx.getBean("userController");
System.out.println(userController);
UserService userService=(UserService) ctx.getBean("userService");
System.out.println(userService);
UserRepository userRepository=(UserRepository) ctx.getBean("userRepository");
System.out.println(userRepository);
}
}