1.自动配置的思想:
1.收集Spring开发者的 编程习惯,整理开发过程中使用的常用技术列表--->技术集A
2.收集常用技术(技术集A)的使用参数,整理开发过程中每个技术的常用设置列表--->设置集B
3.初始化springboot的基础环境,加载用户自定义的bean和导入的其他坐标,形成初始化环境
4.将技术集A包含的所有技术都定义出来,在spring/springboot启动时默认加载全部
5.将技术集A中具有使用条件的技术(通过@Conditionalxxx)约定出来,设置为按条件加载,由开发者决定是否使用该技术(与初始化环境进行比较)
6.将设置集B作为默认配置加载(约定大于配置),减少开发者配置工作量
7.开放设置集B的配置覆盖接口,由开发者根据自身需要决定是否覆盖配置
约定大于配置:
springboot 将技术的默认配置配好,用不用这些配置取决于开发者自己,减少了开发者配置的工作量
2.自定义starter
设计一个starter,该starter的功能为当用户访问网页的时候,记录访问次数和IP地址
1.创建一个springboot工程,定义包含业务功能的类IpCountServiceImpl
package com.itheima.service.impl;
import com.itheima.service.IpCountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
import java.util.HashMap;
import java.util.Map;
@Service
public class IpCountServiceImpl implements IpCountService {
//map用来存放数据
private Map<String,Integer> ipCountMap=new HashMap<>();
@Autowired
//当前的request对象的注入工作由使用当前starter的工程提供自动装配
private HttpServletRequest httpServletRequest;
@Override
public void count() {
//每次调用当前操作,就记录当前访问的IP,然后累加访问次数
//1.获取当前操作的IP地址
String ip=httpServletRequest.getRemoteAddr();
//2.根据Ip地址从map取值,并且递增
Integer count=ipCountMap.get(ip);
if(count==null)
{
ipCountMap.put(ip,1);
}
else
{
ipCountMap.put(ip,count+1);
}
}
}
2.在config包下创建自动配置类IpAutoConfiguration,将IpCountServiceImpl导入
可以使用@Import注解导入,也可以用@Bean
package com.itheima.autoconfig;
import com.itheima.service.IpCountService;
import com.itheima.service.impl.IpCountServiceImpl;
import org.springframework.context.annotation.Bean;
public class IpAutoConfiguration {
@Bean
public IpCountService ipCountService()
{
return new IpCountServiceImpl();
}
}
3.在resources目录下创建META-INF目录,在META-INF目录下创建spring.factories
4.在spring.factories中导入IpAutoConfiguration类
通过自动配置的形式加载业务功能
# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.itheima.autoconfig.IpAutoConfiguration
5.将项目clean后,在安装到本地仓库
至此一个简易的starter就定义好了,使用的时候在项目的Pom.xml文件中导入即可