Spring Boot常用注解简单整理(包括:@ComponentScan、@MapperScan、@Controller、@RequestMapping、@Autowired、@Repositor等

  • @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中显示使用进行Bean的配置了。Spring容器初始化时将自动扫描指定包及子包下的所有class文件,所有标注了@Repository的类都将被注册为Spring Bean。为什么 @Repository 只能标注在 DAO 类上呢?这是因为该注解的作用不只是将类识别为Bean,同时它还能将所标注的类中抛出的数据访问异常封装为 Spring 的数据访问异常类型。 Spring本身提供了一个丰富的并且是与具体的数据访问技术无关的数据访问异常结构,用于封装不同的持久层框架抛出的异常,使得异常独立于底层的框架。

通过在类上使用 @Repository、@Component、@Service 和 @Constroller 注解,Spring会自动创建相应的 BeanDefinition 对象,并注册到 ApplicationContext 中。这些类就成了 Spring受管组件。这三个注解除了作用于不同软件层次的类,其使用方式与 @Repository 是完全相同的。

设计到这些注解的小demo:

https://download.csdn.net/download/yimba/10689907

你可能感兴趣的:(Spring,Boot)