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和@Componen
t这样注解下的包进行注册,而@MapperScan
则是对一些Mapper进行扫描
小结
在这里我有一个小疑问,为什么Spring要给@ComponentScan
和@MapperScan
这两个注解,而不是只用其中一个注解就把所有所有指定的类都进行注册?希望知道答案的dalao能回复一哈。
答案:(也是个人理解)
他们两个所在的包不同,@ComponentScan
是由spring提供的,而@MapperScan
是由mybatis提供的
第一次写博客,有很多的不足,甚至排版也十分的丑陋,大家觉得我的理解有什么问题,都可以指出来,又或者大家有更好的看法,也可以进行补充,大家一甚至起进步,从菜鸡一起努力变成大佬吧!!!
等学习了新的知识,俺也会回来把这篇博客改进的