Spring Boot 注解的一些个人小理解

SpringBoot中一些注解的一些个人小理解

个人认为,Spring-boot中最关键的注解,莫过于@SpringBootApplication了。他一般都是配置在XXXapplication的文件中,也就是一般说的主类(大概)

其中@SpringApplication中就包含了很多其他的注解其中比较重要的就是@ComponentScan,@Configuration,@EnableAutoConfiguration这三个了

现在稍微能理解的也就只有@ComponentScan,后面我也有提到。

@controller

@service

@repository

@component

关于上述的这4个注解,分别是用来对控制层,业务层,持久层(Dao,Mapper),而component则是用来对不在上述范围的其他层进行。这些其实也是声明bean的一个注解

@Autowired

毕竟我是从Spring Boot直接上手Spring框架的,并不是很理解Spring传统的配置是啥,所以对于我个人的理解来说,@Autowired就可以相当于我们平时所用的new,至于为什么不用new呢?我去请教dalao,他说,Spring这个框架所用的设计模式是一种工厂模式,什么叫工厂模式呢?简单来说,就是程序员(也就是我们),只需要第一个需求,Spring这个框架会帮助我们实现大量的繁琐的操作,(以下为个人理解)就好像我们需要造一把刷子,我们只需要和工厂提要求,工厂就会通过你给的需求进行刷子的生产,而我们只需要把刷子拿过来用。相当于白嫖(没有人能顶得住白嫖带来的诱惑),而new则是相当于我自己的工厂,自己生产,这自然就没有白嫖的香。而且这也违反了Spring的设计模式,至于什么是设计模式,俺也不懂,大概就是字面意思吧。

我现在创建了一个Dao层的代码里面有一个登录方法


@Repository
public interface UserDao {
//    int UserRegister(@Param("username") Integer username,
//    @Param("password") String password, @Param("nickname") String nickname);
    


    List<User> UserLogin(@Param("username") Integer username,
                              @Param("password") String password);

}

然后我又创建了一个业务层的代码

@Service
public class LoginService {

    @Autowired
    UserDao userDao;

    public List<User> Login(User user){
        List<User> user1 = userDao.UserLogin(user.getUsername(),user.getPassword());

        return user1;
    }
}

//我们不难发现,我们在使用了@Autowired的注释UserDao后,便可以直接使用UserDao里面的登录方法,而我们在回想一下以前学过的东西,这不就是把UserDao给new出来的操作吗

如果这还有疑惑的话,那我们再创建一个控制层

public class LoginController {

    @Autowired
    LoginService loginService;

    @PostMapping("/login")
    public List<User> UserLogin(@RequestParam("username") Integer username,
                          @RequestParam("password") String password){
        User user = new User();
        user.setUsername(username);
        user.setPassword(password);
        List<User> user1 = loginService.Login(user);
        //啊这啊这,这就是new吧。

        return user1;
    }

}

其实就我现在的水品来说,我就会把@Autowired当作再Spring框架里面的一种new方法。等以后深入理解Spring这个框架后,应该还会有别的不同的理解吧。。。。

@Responbody

@RestController

这些我也是从大佬博客看来的

链接需要的可以自取啊

关于@Responbody,首先其直接将客户端返回数据输出到客户端,如果返回的是一个字符串,这直接输入,如果返回的不是字符串,则把其序列化成JSON字符串后再进行输出。@RestController@Responbody+@RestController。那么就很奇怪为啥要这么做,因为@Controller是需要一个页面进行响应,而@RestController因为具有@Responbody的特性。则没有页面也能在哭护短看到输出的数据。

@ ComponentScan

关于这个注解,当我们告诉Spring哪些类需要被注册成Bean,在我们在某个包下使用@SpringBoorApplication注册main时,Spring Boot就会自动扫描这个包以及其下级的目录。但是,当我所想要注册的Bean不在这个main包或其下级目录时,Spring Boot就没有办法进行扫描,这时候通常就会报一个类似于

**Consider defining a bean of type ‘XXX.XX.X’(我们自己定义的目录结构) in your configuration.**的这样的一个Action

所以我们这时候就需要使用@ConpenentScan去指定我们想要Spring Boot去注册的类。他自己找不到,我们就自己帮他找

而我们在定义@ComponentScan的时候,有两种定义方法

一种是只有一个参数的

**@ComponentScan("XXX.XX.XX");**

还有一种是拥有多个参数的

**@ComponentScan({"XXX.XX.XX","XXX.XX.XX"})**

但是但我们使用了第二中后,Spring就不会扫描@SpringBoorApplication所指定的所指定的包了,所以我们还需要把@SpringBootApplication下面的包也一并指定了

其实@SpringBootApplication底层也有@ComponentScan的注解,所以他才能够进行扫描

@MapperScan

还有另外一个注解@MapperScan,它的作用可以说和@ComponentScan是一样的,都是对指定包的扫描,但是我们在上面有提到过,@ComponentScan是对有@Controller,@Service和@Component这样注解下的包进行注册,而@MapperScan则是对一些Mapper进行扫描

小结

在这里我有一个小疑问,为什么Spring要给@ComponentScan@MapperScan这两个注解,而不是只用其中一个注解就把所有所有指定的类都进行注册?希望知道答案的dalao能回复一哈。
答案:(也是个人理解)
他们两个所在的包不同,@ComponentScan是由spring提供的,而@MapperScan是由mybatis提供的

第一次写博客,有很多的不足,甚至排版也十分的丑陋,大家觉得我的理解有什么问题,都可以指出来,又或者大家有更好的看法,也可以进行补充,大家一甚至起进步,从菜鸡一起努力变成大佬吧!!!

等学习了新的知识,俺也会回来把这篇博客改进的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值