前言
前面我们学习了Java基础和算法,接下来我们通过学习SpringBoot基础来强化代码书写能力,只有通过基础项目实践才能发现问题,在此过程中我们则可以进一步学习JVM虚拟机和线程知识,岂不两全其美,好了,话不多讲,我们开始。
SpringBoot入门
在还未接触SpringBoot时,自我感觉是一个全新的框架,可能需要花费很多时间去学习,但当我了解完基础原理后,发现并不是全新学习,一切通过注解来进行配置从而实现IOC,相对.NET Core而言不过是在表达方式上使用不同罢了,可以理解为换汤不换药。Spring Boot由Pivotal Team开发基于Java的开源框架,可用于创建微服务,它为Java开发者提供了一个很好的平台,用于开发可以独立运行的生产级Spring应用程序,通过最低配置,而无需整个Spring配置设置。SpringBoot设计目标:【避免复杂的XML配置】、【减少开发时间并独立运行应用程序】、【灵活配置Java Bean、XML配置和数据库事务】、【强大批处理功能并管理REST端点】、【简化依赖管理】、【提供嵌入式Servlet容器】、【所有内容自动配置而无需手动配置】。SpringBoot的工作原理:通过使用@EnableAutoConfiguration注解,根据添加到项目中的依赖项自动配置应用程序。例如,如果MySQL数据库位于类路径上,但尚未配置任何数据库连接,则Spring Boot会自动配置内存数据库。Spring Boot应用程序的入口点是包含@SpringBootApplication和main方法的类,Spring Boot使用@ComponentScan注解自动扫描项目中包含的所有组件。通过idea初始化SpringBoot后,如下:
我们知道在.NET Core中已定义控制器、而路由则可以灵活定义,在SpringBoot中一切都通过注解进行,接下来我们来启动SpringBoot应用程序并打印出hello world,如下:
package com.demo.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; @SpringBootApplication @Controller public class SpringbootApplication { @RequestMapping @ResponseBody public String sayHello(){ return "hello world"; } public static void main(String[] args) { SpringApplication.run(SpringbootApplication.class, args); } }
上述我们只是简单打印了hello world,后续结合数据库进行增删改查时再来详细讲解上述注解,我们首先熟悉其他基础注解概念,我们通过如下一个例子来说明:模拟数据库查询获取用户列表,首先我们定义用户类,如下:
package com.demo.springboot; public class User { public int age; public String name; public User(int age, String name) { this.age = age; this.name = name; } }
接下来我们模拟数据库,如下获取用户列表:
package com.demo.springboot; import java.util.ArrayList; import java.util.List; public class UserDAL { public ListgetUsers() { List users = new ArrayList<>(); for (int i = 18; i < 30; i++) { users.add(new User(i, "jeffcky" + Integer.toString(i))); } return users; } }
我们定义一个配置类来获取上述UserDAL,如下:
package com.demo.springboot; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration @ComponentScan(basePackages = "com.demo.springboot") public class SpringConfig { @Bean public UserDAL getUserDAL() { return new UserDAL(); } }
@Configuration和@ComponentScan注解
在SpringBoot 1.x时通过XML来代替注解进行配置,但是随着项目扩大,通过XML配置所带来的的问题显而易见,随着JDK 1.5发布开始支持注解,所以在SpringBoot也通过注解替代了繁琐的XML配置,我们通过使用注解@Configuration意在表明这相当于一个XML文件,那么注解@ComponentScan又是什么意思呢?因为在Spring应用程序启动时,需要扫描包中所有类使其成为Bean(下面会讲),但是我们需要告诉到底在哪里搜索这些类呢?这个时候就需要使用注解@ComponentScan。在Spring中,我们通过@ComponentScan结合注解@Configuration来指定需要查找的包,若没有指定参数,则默认查找当前包以及当前包下所有子包,参数basePackages有别名value且为数组即可同时指定多个包。所以上述可去除参数,直接用注解@ComponentScan即可,同时该注解也支持过滤类型,这个我们留到后续再进行详细讲解。
@Bean注解
在Spring应用程序中,由Spring IoC容器管理的对象称为bean,也就是说Bean是由Spring IoC容器进行实例化,组装和以其他方式管理的对象,说白了就是进行依赖注入而不是直接实例化。
@Service和@Autowired注解
接下来我们定义Service并获取用户列表,如下:
package com.demo.springboot; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { @Autowired public UserDAL userDAL; public ListgetUsers(){ return userDAL.getUsers(); } }
@Service注解使用类路径扫描自动检测和配置Bean,上述注解@Service也可以起别名,@Autowired注解用来获取注册在Spring IOC容器中的bean对象,若使用构造函数注入,则无需使用注解@Aurowired。比如如下:
package com.demo.springboot; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserService { private UserDAL userDAL; public UserService(UserDAL userDAL) { this.userDAL = userDAL; } public ListgetUsers() { return userDAL.getUsers(); } }
最后我们获取容器中的Service并获取用户列表,如下:
package com.demo.springboot; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; import java.util.List; @SpringBootApplication public class SpringbootApplication { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringbootApplication.class, args); UserService userService = context.getBean(UserService.class); Listusers = userService.getUsers(); for (User user : users) { System.out.println("年龄:" + user.age + " 姓名:" + user.name); } } }
总结
本节我们学习了SpringBoot中几个基础注解,还是蛮简单的,好了本节内容到此为止,感谢您的阅读,我们下节见。