Springboot(编程不良人)
文章目录
1、SpringbootApplication注解相关说明
该注解是一个只能作用在类上组合注解(由@SpringBootConfiguration和@EnableAutoConfiguration和@ComponentScan)
其中@Target(指定注解作用范围)、@Retention(指定注解什么时候有效)、@Doucumented、@Inherited四个注解为java自带的元注解:只能修饰注解的注解。
-
@SpringBootConfiguration:这个注解就是用来自动配置spring、springmvc(初始化servlet。。。)相关环境
-
@EnableAutoConfiguration:开启自动配置,自动配置spring相关环境,引入第三方技术自动配置环境(mybatis-springboot、redis-springboot等第三方技术)
-
ComponentScan:组件扫描 根据注解发挥注解作用,默认扫描当前包以及其子包
2、配置文件拆分以及加载外部配置文件
平时我们的生产环境配置和开发环境配置一般不同,如何在springboot的配置文件中更换不同环境的配置文件
方法一
1、通过application-XXX.yml命名作为其他环境配置
2、在application.yml中更换配置环境
测试
1.通过application.yml进行公共配置
2.创建开发环境application-dev.yml
3.创建开发环境application-prod.yml
3.在application.yml设置开启的环境配置
4、访问hello请求
方法二 调用外部的配置文件
修改启动程序的参数
–spring.config.location=外部配置文件的绝对地址
3、管理对象的创建
3.1、创建单个对象
在springboot中管理单个对象课直接使用spring框架中注解形式创建
- @Component 通过注解创建对象
- Controller 用来创建控制器对象
- Service 用来创建业务层对象
- Repository 用来创建Dao层对象
- 以上注解都有value属性,value属性用来指定工厂终对象的名称
例子:
1、service包中的DemoService接口
public interface DemoService {
public void Demo();
}
2.service包中的DemoServiceImpl类
@Service
public class DemoServiceImpl implements DemoService{
@Override
public void Demo() {
System.out.println("Demo()方法");
}
}
3、controller包中的DemoController
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@RequestMapping("/demo")
public String demo(){
demoService.Demo();
return "demo ok";
}
}
3.2、创建多个对象
如何在springboot中像spring框架一样通过xml创建对个对象,在springboot中也提供了相同的注解,如:
@Configuration、@Bean
- @Configuration:代表这是一个spring的配置类,相当于spring.xml配置文件
- @Bean:用来在工厂中创建这个@Bean注解表示对象
- 默认使用@Bean创建对象在工厂中唯一标识为方法名称
- 修改在工厂中对象标识可以使用@Bean(“工程中的名字”)指定一个名字
例子:
1.在config包下创建BeanConfig类
@Configuration//注解表名这是一个配置类,相当于spring中的spring.xml
public class BeanConfig {
@Bean//注入Calendar类型的对象,名字与方法名相同
public Calendar calendar(){
return Calendar.getInstance();
}
}
2、controller层测试
@RestController
public class DemoController {
@Autowired
private DemoService demoServiceImpl;
@Autowired
private Calendar calendar;
@RequestMapping("/demo")
public String demo(){
demoServiceImpl.Demo();
System.out.println("日期:"+calendar.getTime());
return "demo ok";
}
}
4、属性注入
1、@Value注解进行属性注入
引用类型:@Autowried
8中基本类型,String,数组、list、map
例子:
1、appliacation.yml
name: 小莫
age: 21
birthday: 2000/12/12 12:12:12 #java中默认的日期格式是:yyyy/mm/dd HH:MM:ss
sex: false
qqs: 1,2,3,4 #注入数组时,多个元素用','隔开
lists: morant,more,lirmood #注入list时,多个元素用,隔开,和数组一样
maps: "{'name':'morant','age':'21'}" #json字符串的形式
2、injectController
@RestController
public class injectController {
@Value("${name}")
private String name;
@Value("${age}")
private int age;
@Value("${birthday}")
private Date birthday;
@Value("${sex}")
private boolean sex;
@Value("${qqs}")
private int[] qqs;
@Value("${lists}")
private List<String> lists;
@Value("#{${maps}}")//在注入map集合时,配置文件要是用json格式赋值 在注入式必须使用@{#{${}}}进行注入
private Map<String,String> maps;
@RequestMapping("/inject")
public String inject(){
System.out.println("name = " + name);
System.out.println("age = " + age);
System.out.println("birthday = " + birthday);
System.out.println("sex = " + sex);
System.out.println("=================");
System.out.println("数组遍历");
for (int qq : qqs) {
System.out.println("qq = " + qq);
}
System.out.println("=================");
System.out.println("list遍历");
lists.forEach(li-> System.out.println("li = " + li));
System.out.println("=================");
System.out.println("map遍历");
maps.forEach((key,value)-> System.out.println("key = " + key+" value = "+ value));
return "inject ok";
}
}
2、以对象的形式注入
@ConfigurationProperties:
/**
*作用范围:作用在类上
* 作用:用来指定配置文件中前缀的属性 注入到当前对象中属性一致的属性中
* 注意:必须要有get和set方法
*/
例子:
1、application.yml文件
order:
id: 19100116
age: 21
2、inject2Controller(一定要有get和set方法,一定要是用@ConfigurationProperties注解)
@RestController
/**
* 作用范围:作用在类上
* 作用:用来指定配置文件中前缀的属性 注入到当前对象中属性一致的属性中
* 注意:必须要有get和set方法
*/
@ConfigurationProperties(prefix = "order")
public class inject2Controller {
private String id;
private String age;
@RequestMapping("/inject2")
public String inject2(){
System.out.println(id);
System.out.println(age);
return "inject2 OK";
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
5、整合mybatis思路分析
5.1、回顾spring框架如何整合mybatis
1.引入依赖
- spring相关
- mysql相关 驱动 数据源
- mybatis相关 mybatis核心jar mybatis和spring框架整合
2。spring.xml
- 开启注解扫描
- 创建数据源对象
- 注入 指定使用哪种数据源类型 注入diverClassName 注入url、username、password
- 创建sqlSessionFactory
- 注入 数据源 注入mapper配置文件位置 注入实体别名包
- 创建Dao对象
- 注入SqlSessionFactory 以及Dao接口所在包
- 创建事务管理器 DataSourceTranacationManager
- 注入数据源对象
- 在业务层组件上加入事务注解 @Transacational
3.测试
5.2、springboot框架如何整合mybatis
1.引入依赖
- spring-web
- mysql相关 mysql驱动 druid数据源
- mybatis相关(mybatis-spring-boot-stater)依赖
2.书写配置
- 开启注解扫描 @SpringBootApplication @ComponentScan可以省略
- 创建数据源
- 注定数据源类型
- 指定数据库驱动
- 指定url
- 指定username
- 指定password
- 创建SqlSessionFactory
- 指定mapper配置文件的位置
- 指定实体所在的包的位置 起别名
- 创建Dao
- 指定Dao接口所在的包
3.测试
例子
1、导入依赖
<!--导入数据源 druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.4</version>
</dependency>
<!--导入数据库驱动 mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.25</version>
</dependency>
<!--导入mybatis-springboot-starter 包含mybatis和mybatis-spring-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
2、修改配置文件 application-yml
server:
port: 8989
servlet:
context-path: /springboot-mybatis
#整合mybatis相关配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
password: 123456
username: root
url: jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
#mybatis相关配置设置之后 才会创建SqlSessionFcatory
mybatis:
type-aliases-package: com.morant.entity #指定实体类的包名,默认别名:类名或者类名的首字母小写
mapper-locations: classpath:com/morant/mapper/*.xml #指定mapper配置文件的位置
#在主类中指定dao接口所在的包
3、在主类中指定dao接口所在的包
@SpringBootApplication
@MapperScan("com.morant.dao")//修饰范围:用在类上 作用:用来扫描dao接口所在的包 同时将所有dao接口在工厂中创建代理对象
public class SpringBootMybatisApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootMybatisApplication.class, args);
}
}
4、测试
4.1、创建数据库
4.2、创建实体类User
public class User {
private int id;
private String name;
private String password;
public User(int id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public User() {
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
4.3、创建Userdao接口
public interface UserDao {
public List<User> findall();
}
4.4、在创建UserDaoMapper配置文件
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.morant.dao.UserDao">
<select id="findall" resultType="user">
select id,name,password
from `user`
</select>
</mapper>
4.5、创建UserService接口
public interface UserService {
public List<User> findall();
}
4.6、创建UserServiceImpl实现类
@Service
@Transactional
public class UserServiceImpl implements UserService{
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
//这里报错没关系,因为Dao还没被主类扫描进来,或者在Dao上加@Mapper
this.userDao = userDao;
}
public List<User> findall(){
return userDao.findall();
};
}
4.7创建UserController
6、@Mapper注解和@MapperScan接口的区别
@Mapper:添加在Dao接口上,在工厂中创建代理对象,但是一次只能作用一个Dao接口,相对麻烦
7、本地测试
7.1、spring中的本地测试
1、启动工厂
ApplicationCpntext context = new ClassPathXmlApplicationContext("spring.xml")
2、从工厂中获得指定对象
UserDao userDao = context.getBean("UserDao")
3、调用方法
useDao.xxx(参数)
7.2、Springboot框架中完成本地测试
1.引入结合junit和springboot的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- 启动springboot应用才能启动工厂 注入测试对象
@SpringBootTest
作用范围:在类上
作用:在这个类实例化过程中启动springboot应用
8、日志处理
springboot框架集成日志logback日志
8.1、日志的级别
-
ALL:最低等级的,用于打开所有日志记录。
-
TRACE:很低的日志级别,一般不会使用。
-
DEBUG: 指出细粒度信息事件对调试应用程序是非常有帮助的,主要用于开发过程中打印一些运行信息。
-
INFO: 消息在粗粒度级别上突出强调应用程序的运行过程。打印一些你感兴趣的或者重要的信息,这个可以用于生产环境中输出程序运行的一些重要信息,但是不能滥用,避免打印过多的日志。
-
WARN: 表明会出现潜在错误的情形,有些信息不是错误信息,但是也要给程序员的一些提示。
-
ERROR: 指出虽然发生错误事件,但仍然不影响系统的继续运行。打印错误和异常信息,如果不想输出太多的日志,可以使用这个级别。
-
FATAL: 指出每个严重的错误事件将会导致应用程序的退出。这个级别比较高了。重大错误,这种级别你可以直接停止程序了。
-
OFF: 最高等级的,用于关闭所有日志记录。
8.2、日志的配置
#配置日志
logging:
level:
root: info #全局日志
com.morant.service: debug #指定包的日志
file:
name: run.log #输出日志文件的名字
path: ./ #将日志文件生成在本项目下
调试时输出日志
@Service
@Transactional
public class UserServiceImpl implements UserService{
private static final Logger log = LoggerFactory.getLogger(UserServiceImpl.class);
private UserDao userDao;
@Autowired
public UserServiceImpl(UserDao userDao) {
this.userDao = userDao;
}
public List