- @ComponentScan
自动扫描包路径下的所有@Controller、@Service、@Repository、@Component的类。
它里面的属性:value指定扫面的包,includeFilters包含哪些过滤,excludeFilters不包含哪些过滤,useDefaultFilters默认的过滤规则是开启的,如果我们要自定义的话要关闭的。其中@Filters是一个过滤器接口。
@Filters指过滤规则,FilterType指定过滤的规则(
FilterType.ANNOTATION:按照注解
FilterType.ASSIGNABLE_TYPE:按照给定的类型;
FilterType.ASPECTJ:使用ASPECTJ表达式
FilterType.REGEX:使用正则指定
FilterType.CUSTOM:使用自定义规则)
classes指定过滤的类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.ComponentScan.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
import com.guang.entity.Person;
@Configuration
// @ComponentScan("包路径") 会自动扫描包路径下面的所有@Controller、@Service、@Repository、@Component 的类
// includeFilters 指定包含扫描的内容
// excludeFilters 指定不包含的内容
// @Filter 指定过滤规则,type指定扫描的规则(注解,正则,自定义,ASPECTJ表达式),classes指定的扫描的规则类
@ComponentScan(basePackages = {"com.guang"},
includeFilters = @Filter(type = FilterType.ANNOTATION, classes = {Controller.class}),
excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = {Repository.class}),
includeFilters = @Filter(type = FilterType.CUSTOM, classes = {FilterCustom.class}),
useDefaultFilters = false)
public class Myconfig {
@Bean("person")
public Person person01() {
return new Person("aiha", 25);
}
}
二、如果我们在使用自定义(includeFilters = @Filter(type = FilterType.CUSTOM, classes = {自己定义的类}))过滤规则的时候,我们自定义的类要实现TypeFilter接口,例如:
import java.io.IOException;
import org.springframework.core.type.ClassMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.TypeFilter;
/**
* 自定义的过滤规则,在自动扫描的时候用,自定义过滤的时候不在使用默认的规则了
*
* @ClassName FilterCustom
* @author xxx
* @date xxx
* @version xxx
*/
public class FilterCustom implements TypeFilter {
/**
*
* @Title: match
* @Description: 覆盖方法注释标签说明
* @param metadataReader 读取的当前正在扫描类的信息
* @param metadataReaderFactory 类工厂中其它类的信息
* @return
* @throws IOException
* @see org.springframework.core.type.filter.TypeFilter#match(org.springframework.core.type.classreading.MetadataReader,
* org.springframework.core.type.classreading.MetadataReaderFactory)
*/
@Override
public boolean match(MetadataReader metadataReader, MetadataReaderFactory metadataReaderFactory)
throws IOException {
// 获取当前类注解的信息
// AnnotationMetadata metadata = metadataReader.getAnnotationMetadata();
// 获取当前正在扫描类的信息
ClassMetadata classMetadata = metadataReader.getClassMetadata();
// 获取当前类路径的信息
// Resource resource = metadataReader.getResource();
if (classMetadata.getClassName().startsWith("person")) {
return true;
}
return false;
}
}
- @MapperScan
之前是直接在mapper类上面添加注解@Mapper,这种方式需要对每一个mapper类添加此注解,非常麻烦。所以通过@MapperScan可以指定要扫面的Mapper类的包的路径,比如:
@SpringBootApplication
@ComponentScan(basePackages="com.itas.*")
@MapperScan(basePackages="com.itas.mapper")
public class ITasApplication {
public static void main(String[] args) {
SpringApplication.run(ITasApplication.class, args);
}
}
同时使用@MapperScan注解多个包:@MapperScan({"com.itas.mapper","com.itas.user"})
如果如果mapper类没有在Spring Boot主程序可以扫描的包或者子包下面,可以使用如下方式进行配置:
@MapperScan({"com.kfit.*.mapper","org.kfit.*.mapper"})
- @Controller
处理Http请求
@Controller
public class TestController {
@Autowired
private UserService userService;
@RequestMapping(value="/index",method=RequestMethod.GET)
@ResponseBody
public Map index() {
Map map = new HashMap();
map.put("姓名:", "张三");
return map;
}
@RequestMapping("/findById")
@ResponseBody
public List findById() {
List userList = userService.findByID();
return userList;
}
}
- @RequestMapping
是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径;用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到该方法,此处需注意@RequestMapping用在类上可以没用,但是用在方法上必须有。
@Controller
//设置想要跳转的父路径
@RequestMapping(value = "/Controllers")
public class StatisticUserCtrl {
//如需注入,则写入需要注入的类
//@Autowired
// 设置方法下的子路经
@RequestMapping(value = "/method")
public String helloworld() {
return "helloWorld";
}
}
其对应的 action 就是“ (父路径) controller/(父路径下方法路经)method ”。因此,在本地服务器上访问方法 http://localhost:8080/controller/method 就会返回(跳转)到“ helloWorld.jsp ”页面。
- @Autowired
他可以对类成员变量、方法及构造函数进行标注,完成自动转配的工作。通过@Autowrite的使用来消除set,get方法。无须再通过传统的在bean的xml文件中进行bean的注入配置。而是使用注解,系统自动为你注入,即隐式配置。
首先要知道:@Autowrite是根据类型进行标注的,如需要按照名称进行装配,则需要配合@Qualifier使用进行指定包扫描的component
使用示例:
创建一个Spring的配置文件:
写一个测试用的接口,这里命名为光盘(CompactDisc)
public interface CompactDisc {
void play();
}
利用注解@Component声明一个组件类。 具体实现:
@Component
public class SgtPeppers implements CompactDisc{
@Override
public void play() {
System.out.println("SgtPeppers playing....");
}
}
编写一个Player类,进行@Autowired,装配类。实现方式有三种,如下所示。
在方法上:
public class CDPlayer {
CompactDisc cd;
//对方法进行标注
@Autowired
public void setCompactDisc(CompactDisc cd){
this.cd = cd;
}
public void say(){
cd.play();
}
}
或者在成员变量上:
public class CDPlayer{
//对成员变量进行标注
@Autowired
CompactDisc cd;
public void say(){
cd.play();
}
}
或者在构造函数上
public class CDPlayer {
CompactDisc cd;
//对构造函数进行标注
@Autowired
public CDPlayer(CompactDisc cd){
this.cd = cd;
}
public void say(){
cd.play();
}
}
注意:如果构造函数有两个入参,分别是 bean1 和 bean2,@Autowired 将分别寻找和它们类型匹配的 Bean
编写一个测试类,作为验证是否自动为我们注入了 CompactDisc。
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("AutowiredBean.xml");
CDPlayer player = (CDPlayer) context.getBean("cdPlayer");
player.say();
}
}
结果: SgtPeppers playing….
运行,验证成功了,系统为我们自动注入了SgtPeppers这个组件类。
由于针对接口编程,因此很有可能多个类实现了同一个接口,这时Spring如果扫描到多个匹配对象,导致Spring不知道选择哪个好,那Spring不客气的就报错了。。。
注:SpringMVC是在组件扫描完成之后开始执行bean的实例化的。
在springmvc中,我们通过配置
- @ResponseBody
表示该方法的返回结果直接写入HTTP响应正文(ResponseBody)中,一般在异步获取数据时使用,通常是在使用@RequestMapping后,返回值通常解析为跳转路径,加上@ResponsBody后返回结果不会被解析为跳转路径,而是直接写入HTTP响应正文中。
作用:
该注解用于将Controller的方法返回的对象,通过适当的HttpMessageConverter转换为指定格式后,写入到Response对象的body数据区。
使用时机:
返回的数据不是html标签的页面,而是其他某种格式的数据时(如json,xml等)使用;
- @Service
用于标注业务层组件,如果一个类自动带了@Service注解,将自动注册到Spring容器,不需要再在application.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。
- @SpringBootApplication
包含三个注解:@SpringBootApplication = (默认属性)@Configuration + @EnableAutoConfiguration + @ComponentScan。
分开解释:
1、@Configuration:提到@Configuration就要提到他的搭档@Bean。使用这两个注解就可以创建一个简单的spring配置类,可以用来替代响应的xml配置文件。
相当于:
@Configuration
public class Conf {
@Bean
public Car car() {
Car car = new Car();
car.setWheel(wheel());
return car;
}
@Bean
public Wheel wheel() {
return new Wheel();
}
}
@Configuration注解类标识这个类可以使用Spring IOC容器作为bean定义的来源。@Bean注解告诉spring,一个带有@Bean的注解方法将返回一个对象,该对象应该被注册为在spring应用程序上下文中的Bean。
2、@EnableAutoConfiguration:能够自动配置spring上下文,视图猜测和配置你想要的Bean类,通常会自动根据你的类路径和你的bean定义自动配置。
3、@ComponentScan:会自动扫描指定包下的全部标有@Component的类,并注册成bean,当然包括@Component下的子注解@Service、@Repository,@Controller。
- @Repository
他用于将数据访问层(Dao层)的类标识为Spring Bean。如此就不需要在XML中显示使用
通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。
设计到这些注解的小demo:
https://download.csdn.net/download/yimba/10689907