Spring中Dao,Service,Controller通过注解方式加入到IOC容器中

将组件加入到IOC容器有很多方法:对于三层组件来说,有两种:

举个例子来进行说明,创建三层模型来进行模拟。建立两个Dao层。

Controller

package org.awen.controll;

import org.springframework.stereotype.Controller;

@Controller
public class StudentController {
	
}

Service

package org.awen.service;

import org.awen.dao.StudentDao;
import org.springframework.stereotype.Service;

@Service
public class StudentService {
	
}

Dao

package org.awen.dao;

import org.springframework.stereotype.Repository;

@Repository
public class SchoolDao {

}

Dao

package org.awen.dao;

import org.springframework.stereotype.Repository;

@Repository
public class StudentDao {
	
}

第一种:
首先都通过注解将三层模型加入到 IOC容器中。上面的代码已经包含注解了

Dao层的注解:@Repository

Service层的注解:@Service

Controller层的注解:@Controller

将其在applicationContext.xml之中配置,也就是添加扫描器,扫描多个包就行了。

	
	
	

这是代码的结构
Spring中Dao,Service,Controller通过注解方式加入到IOC容器中_第1张图片
测试方法
直接调用该方法即可。

public static void testAnnotation() {
		ApplicationContext contet=new ClassPathXmlApplicationContext("applicationContext.xml");

		/**
		 * 遍历容器中所有的bean
		
		 * */
		String[] ids=contet.getBeanDefinitionNames();
		for(String id:ids) {
			System.out.println(id);
		}
	}

第二种:
将其写入配置类之中。首先第一步都是相同的,都是在三层上面加上,注解。
将三层都包含在其内部了。

//这个东西 会将 当前配置类 也纳入到IOC容器中 并且id就是类名
@Configuration

@ComponentScan(value="org.awen")
public class MyConfig {


	
}

test的方法为:

	public static void testAnnotation_one() {
		ApplicationContext contet=new AnnotationConfigApplicationContext(MyConfig.class);
		String[] ids=contet.getBeanDefinitionNames();
		for(String id:ids) {
			System.out.println(id);
		}
	}

补充说明:

1.excludeFilters中type=FilterType.ANNOTATION

在Config.class的注解里面@ComponentScan是可以进行选择的。
比如

@ComponentScan(value="org.awen",excludeFilters= {@ComponentScan.Filter(type=FilterType.ANNOTATION,value= {Service.class,Controller.class})})

这样子,是具有选择的功能的,就将注解为:Service和Controller的类排除掉了,所以显示结果就不包含了Controller,Service类。

2.excludeFilters中的type=ASSIGNABLE_TYPE

@ComponentScan(value="org.awen",excludeFilters= {@ComponentScan.Filter(type=ASSIGNABLE_TYPE,value= {StudentController.class})})

这样子,是将StudentController这个类排除掉。
解释:
FilterType.ANNOTATION
---------这个针对于三层注解类型
FilterType.ASSIGNABLE_TYPE
---------针对具体的类后面跟的是具体的类

3.includeFilters的使用

//这个是包括某些类的使用方法,需要设置默认行为,才可以。禁止默认行为
//@ComponentScan(value="org.awen",includeFilters= {@ComponentScan.Filter(type=FilterType.ANNOTATION,value= {Service.class})},useDefaultFilters=false)

比如这样子,就是将某一些 类加入到其中。

  • excludeFilters:排除
  • includeFilters:有默认行为可以通过useDefaultFilters=false禁止默认行为

4.使用自定义类

这个是使用自定义类 进行 筛选 某一个类 ,在上面写了四个实例的类,分别是

StudentDao.class

SchoolDao.class

StudentService.class

StudentControll.class
这个时候 就会用到 SchoolDao,这里会使用自定义类的方法,将其排除掉。

@ComponentScan(value="org.awen",includeFilters= {@ComponentScan.Filter(type=FilterType.CUSTOM,value= {MyFilter.class})})

MyFilter类:

@Override
	public boolean match(MetadataReader metadataReader, MetadataReaderFactory arg1) throws IOException {
		// TODO 自动生成的方法存根
		ClassMetadata classMetadata=metadataReader.getClassMetadata();
		//扫描器 扫描“org.awen”包中所有的类,getClassName()而可以拿到 该包中所有的类
		String className=classMetadata.getClassName();
		
		//只过滤出  和学生相关的三层组件 把有学生的三层组件纳入到IOC容器中
		if(className.contains("Student")) {
			return true;
		}
		
		return false;
		
	}
	

再次测试的时候,schoolDao就不会在Bean中出现了。

type=FilterType.CUSTOM然后后面跟你的类名加.class 这个是你自己自定义的类 必须实现一个接口

你可能感兴趣的:(spring)