文章目录
1@Configuration配置类
@Configuration相当于applicationcontext.xml
1.1用注解向spring注册
1.1.1@Bean
@Configuration
public class ApplicationConfig {
/**
* @Bean : Spring的bean的定义标签 ,标记方法返回的对象交给Spring容器管理
*/
@Bean
public MyBean myBean(){
return new MyBean();
}
}
>* bean的id: 方法名
>* bean的name:可以通过 @Bean标签的name属性指定
>* 生命周期方法:initMethod , destroyMethod
>* 单利多利: @Scope("prototype")
>* 懒初始化: @Lazy
1.1.2@ComponentScan
@Configuration
@ComponentScan("包名")
public class ApplicationConfig {
}
ComponentScan是ioc组件自动扫描,相当于是 context:component-scan base-package=*
默认扫描当前包,及其子包 ;
ComponentScan.lazyInit :懒初始化
ComponentScan.excludeFilters :排除
1.1.3@conditional
Conditional注解帖在bean的定义方法上来判断,如果不满足条件就不会定义bean
@Bean
@Conditional(value = MyCondition.class)
public MyBean windowsMyBean(){
return new MyBean("windowMyBean");
}
@Bean
@Conditional(value = LinuxCondition.class)
public MyBean linuxMyBean(){
return new MyBean("linuxMyBean");
}
定义条件类
public class MyCondition implements Condition {
/**
* 匹配方法,返回值决定是否满足条件
*/
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//获取系统环境
String systemName = context.getEnvironment().getProperty("os.name");
if("Windows 10".equals(systemName)){
return true;
}
return false;
}
}
1.1.4@Import
直接导入bean或者配置类
@Configuration
@Import(ApplicationOtherConfig.class) //导入其他的配置类
public class ApplicationConfig
导入选择器
@Configuration
@Import(MyImportSelector.class) //导入选择器
public class ApplicationConfig
定义选择器
public class MyImportSelector implements ImportSelector {
//选择导入,该方法返回我们需要导入的类的全限定名
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
return new String[]{
"com.wal.MyBean",
"com.wal.OtherBean"};
}
}
1.1.4 factoryBean 定义bena
定义factoryBean
public class MyBeanFactoryBean implements FactoryBean<MyBean> {
public MyBean getObject() throws Exception {
return new MyBean();
}
public Class<?> getObjectType() {
return MyBean.class;
}
public boolean isSingleton() {
return true;
}
}
将MyFactoryBean向spring容器注册
当需要注入MyBean时spring容器会通过工厂中的getObject得到需要的实例
@Configuration
public class ApplicationConfig {
@Bean
public MyBeanFactoryBean myBean(){
return new MyBeanFactoryBean();
}
}
2bean的生命周期
**MyBean实现InitializingBean初始化接口, DisposableBean销毁接口
**
public class MyBean implements InitializingBean, DisposableBean {
public MyBean(){
System.out.println("创建.............");
}
public void destroy() throws Exception {
System.out.println("destroy方法...........");
}
public void afterPropertiesSet() throws Exception {
System.out.println("初始化方法...........");
}
}
BeanPostProcessor后置处理器
所有的bean都会执行该方法
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之前.....:"+bean);
return bean;
}
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
System.out.println("初始化之后.....:"+bean);
return bean;
}
}
3SpringBoot读取配置
使用@Value读取
@Component
public class Employee {
@Value("${employee.username}")
private String username;
@Value("${employee.age}")
private Integer age;
使用@ConfigurationProperties读取
**
@ConfigurationProperties : 自动的根据前缀从配置中过滤出配置项目,然后根据当前对象的列名进行匹配,自动赋值**
@Component
@ConfigurationProperties(prefix = "employee")
public class Employee {
private String username;
private Integer age;
SpringBoot默认读取application.yml和application.properties
application.yml
employee:
username: "二狗"
age: 12
4日志使用
MySpringBootTest.class日志的使用环境
private Logger logger = LoggerFactory.getLogger(MySpringBootTest.class);
logger.error("error.....");
logger.warn("warn.....");
logger.info("info.....");
logger.debug("debug.....");
logger.trace("trace.....");
4.1指定日志配置文件
logback-spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="60 seconds">
<!-- 日志格式 -->
<property name="CONSOLE_LOG_PATTERN" value="%d{yyyy-MM-dd HH:mm:ss.SSS} ----> [%thread] ---> %-5level %logger{50} - %msg%n"/>
<!--ConsoleAppender 用于在屏幕上输出日志-->
<appender name="stdout" class="ch.qos.logback.core.ConsoleAppender">
<!--定义控制台输出格式-->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--生成日志文档-->
<appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>logs/springboot.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<fileNamePattern>logs/springboot-%d{yyyyMMdd}-%i.log.gz</fileNamePattern>
<maxFileSize>1KB</maxFileSize>
<maxHistory>30</maxHistory>
<!--总上限大小-->
<totalSizeCap>5GB</totalSizeCap>
</rollingPolicy>
<!--定义控制台输出格式-->
<encoder>
<pattern>${CONSOLE_LOG_PATTERN}</pattern>
<!-- 设置字符集 -->
<charset>UTF-8</charset>
</encoder>
</appender>
<!--root是默认的logger 这里设定输出级别是debug-->
<root level="info">
<!--定义了两个appender,日志会通过往这两个appender里面写-->
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</root>
<!--如果没有设置 additivity="false" ,就会导致一条日志在控制台输出两次的情况-->
<!--additivity表示要不要使用rootLogger配置的appender进行输出-->
<logger name="com.wal" level="info" additivity="false">
<appender-ref ref="stdout"/>
<appender-ref ref="file"/>
</logger>
</configuration>
5springBoot集成Thymeleaf
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
模板
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>成功!</h1>
<!--使用语法th:text 将div里面的文本内容设置为 -->
<div th:text="${msg}">这是显示欢迎信息</div>
</body>
</html>
5.1webjars
导入jquery依赖 ( http://www.webjars.org/)
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>3.4.1</version>
</dependency>
<script src="/webjars/jquery/3.4.1/jquery.js"></script>
6自定义拦截器MyHandlerInterceptor
//自定义拦截器
//需要通过配置类添加到拦截器中
@Component
public class MyHandlerInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("你被拦截了。。。。。");
return true;
}
}
注册拦截器
public class Springboot2Application implements WebMvcConfigurer {
@Autowired
private MyHandlerInterceptor myHandlerInterceptor;
//添加自定义拦截器的方法
@Override
public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(myHandlerInterceptor).addPathPatterns("/**");
}
//视图控制器,不需要写controller,就可以访问对应资源
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/xxx").setViewName("xxx");
}
7集成DataSource
导入依赖
<!--导入阿里巴巴连接池-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.20</version>
</dependency>
<!--导入mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
application.yml
#配置连接池dataSource
spring:
datasource:
username: root
password: 123456
url: jdbc:mysql:///crm?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
driver-class-name: com.mysql.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource
8集成mybatis
<!--导入mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
application.yml
#映射器xml路径
mybatis:
mapper-locations: classpath:com/wal/springboot2/mapper/*Mapper.xml
配置类
//扫描映射器
@MapperScan(basePackages = "com.wal.springboot2.mapper")
public class Springboot2Application
9集成事务
开启事务管理器
@EnableTransactionManagement
public class ApplicationConfig{
...}
service打事务标签
@Transactional
@Service
public class EmployeeServiceImpl
10PageHelper使用
导入依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<select id="findPage" resultType="com.wal.springboot2.domain.Employee">
select te.username,te.password from t_employee te
</select>
用了pagehelper之后 ,查询总条数的sql不用写 , limit 不用写
查询
@Override
public Page<Employee> selectPage() {
PageHelper.startPage(1,5 );
Page<Employee> page = (Page<Employee>) employeeMapper.selectPage();
return page;
}
**
PageHelper.startPage(1,5 ):设置当前页和每页条数
Page :是pagehelper自己封装的页面对象,里面有总条数,列表,总页数等等**
11@EnableAutoConfiguration
@EnableAutoConfiguration利用AutoconfigurationImportSelector
将组件导入spring容器中。
AutoConfigurationImportSelector选择器利用用SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包,如果spring容器中没有该类的实例就会用@Bean的形式向spring容器注册实例,注册实例时会通过@configurationProperties读取配置文件