在 classpath 中扫描组件
注意几点:
1、基类所在的包被Spring管理,那么子包下面的被标识的类也会被扫描
什么是子包?
如cn.com.bean下面有基类的话,cn.com.bean.*;都是子类
2、由于Spring扫描是不知道哪个是持久层 业务层 表现层的,但是我们要养成习惯去标识这些类
3、Spring有命名策略,非限定名的第一个字母小写,但是也可以为这个类重命名
以下的名称本来应该是controllInter;但是我们重命名了就是Controllers;这个名字就是相当于bean 的id名称
@Controller(value="Controllers")
public class ControllerClass implements ControllInter{
实例如下:
第一步,建立父包cn.com.bean
第二步,新建一个基类CompentClass
package cn.com.bean;
import org.springframework.stereotype.Component;
@Component
public class CompentClass {
public void text(){
System.out.println("我是受Spring管理的基类....");
}
}
第三步,新建子包
cn.com.bean.controller
包下面一个接口类,一个实现类
package cn.com.bean.controller;
import org.springframework.stereotype.Controller;
@Controller(value="Controllers")
public class ControllerClass implements ControllInter{
@Override
public void save() {
// TODO Auto-generated method stub
System.out.println("标识表现层组件--我实现了ControllInter接口的save方法....");
}
}
package cn.com.bean.controller;
public interface ControllInter {
void save();
}
第四步、新家子包cn.com.bean.Respository
package cn.com.bean.Respository;
import org.springframework.stereotype.Repository;
@Repository(value="res")
public class TRespository {
public void respon(){
System.out.println("标识持久层组件.....");
}
}
第五步、新建子包 cn.com.bean.service
package cn.com.bean.service;
import org.springframework.stereotype.Service;
@Service
public class ServicesTest {
public void sevice(){
System.out.println("标识服务层(业务层)组件....");
}
}
bean-mvc.xml
<?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:component-scan base-package="cn.com.bean"></context:component-scan>
</beans>
测试类如下
package cn.com.bean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import cn.com.bean.Respository.TRespository;
import cn.com.bean.controller.ControllerClass;
import cn.com.bean.service.ServicesTest;
public class TestBean {
/*author:命运的信徒
* date:2018/12/21
* arm:通过注解的方式配置bean
*/
public static void main(String[] args) {
//1.创建ioc容器,获取配置内容
ApplicationContext cox=new ClassPathXmlApplicationContext("bean-mvc.xml");
//通过注解的类的名称的第一个字母小写了,来配置
CompentClass cc=(CompentClass) cox.getBean("compentClass");
System.out.println(cc);
//可以通过@Controller(value="Controllers")重命名,就可以不再是注解类的第一个字母小写的名称了
ControllerClass Controllers=(ControllerClass)cox.getBean("Controllers");
System.out.println(Controllers);
//重命名
TRespository re=(TRespository) cox.getBean("res");
System.out.println(re);
//注解类的第一个字母小写之后获取
ServicesTest st=(ServicesTest) cox.getBean("servicesTest");
System.out.println(st);
}
}
结果
如果仅希望扫描特定的类而非基包下的所有类,可使用 resource-pattern 属性过滤特定的类,示例:
<!-- 通过条件来选择扫描哪个子包 下面的类
<context:component-scan base-package="cn.com.bean" resource-pattern="/service/*"></context:component-scan>
-->
这个时候测试类中,只有service包下面可以正常运行,其他的都会报错!
<context:include-filter> 子节点表示要包含的目标类
<context:exclude-filter> 子节点表示要排除在外的目标类
<context:component-scan> 下可以拥有若干个 <context:include-filter> 和 <context:exclude-filter> 子节点
这个xml经测试过,完全没有问题
<?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:component-scan base-package="cn.com.bean"></context:component-scan>
-->
<!-- 通过条件来选择扫描哪个子包 下面的类
<context:component-scan base-package="cn.com.bean" resource-pattern="/service/*"></context:component-scan>
-->
<!--只扫描哪个注解的类型;include和 use-default-filters="false"搭配使用,不然没有效果 -->
<!-- <context:component-scan base-package="cn.com.bean" use-default-filters="false"> -->
<!-- annotation 类型的是expression是导入包的名称如import org.springframework.stereotype.Controller;
<context:include-filter type="annotation" expression="org.springframework.stereotype.Repository"/>
</context:component-scan> -->
<!-- 除了这种注解的类型以外,其他的都扫描 -->
<!-- <context:component-scan base-package="cn.com.bean">
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan> -->
<!-- 通过类名,不扫描这个类 -->
<!-- <context:component-scan base-package="cn.com.bean" >
<context:exclude-filter type="assignable" expression="cn.com.bean.service.ServicesTest"/>
</context:component-scan> -->
<!-- 通过类名,除了这个类其他子包下面的类都扫描 -->
<context:component-scan base-package="cn.com.bean" use-default-filters="false">
<context:include-filter type="assignable" expression="cn.com.bean.service.ServicesTest"/>
</context:component-scan>
</beans>