Spring 通过注解的方式配置bean(1)

版权声明:博客知识产权来源命运的信徒,切勿侵权 https://blog.csdn.net/qq_37591637/article/details/85156536

在 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>

猜你喜欢

转载自blog.csdn.net/qq_37591637/article/details/85156536