1.IOC的XMl和注解什么关系
两种方式
之前我们配置IOC(控制反转)都是在xml中配置,现在通过注解配置IOC会减少很多代码
IOC就是对bean进行管理:bean注册,实例化
2.swagger和postman异同
Swagger与postman使用心得_李蔚的博客-CSDN博客_postman和swagger的区别
swagger是接口文档 比较清晰 需要在接口中配置 可以直接给前端使用 但是不会记住参数值
postman是调试工具 不用配置 可以记住参数值
3.spring 为什么方便
因为他对各种框架都有支持
不重复造轮子,一行代码搞定,比如不用再去写jdbc连接
4.@Bean与方法名
@Bean是一个方法级别上的注解,主要用在@Configuration注解的类里,也可以用在@Component注解的类里。添加的bean的id为方法名
5.@Mapper与@Repository
@Mapper 是 Mybatis 的注解,和 Spring 没有关系,@Repository 是 Spring 的注解,用于声明一个 Bean
@Repository需要在Spring中配置扫描地址,然后生成Dao层的Bean才能被注入到Service层中。
@Mapper不需要配置扫描地址,通过xml里面的namespace里面的接口地址,生成了Bean后注入到Service层中。
6.@ComponentScan可以用@Filter过滤
6.1包含 includeFilters
@ComponentScan(value = "com.test",
useDefaultFilters = false,//想让includefilter生效就要把默认的禁止
includeFilters = //只扫描包下有@Controller和@ControllerAdivice注解的bean
{@Filter(type = FilterType.ANNOTATION,classes = {Controller.class,ControllerAdvice.class})})
6.2排除excludeFilters
与include不同 这时开启默认
原因:开启默认useDefaultFilters = true时,通过底层代码可以看出,会扫描所有带@Component注解的类
@ComponentScan(value = "com.test",
excludeFilters= //排除包下有@Controller和@ControllerAdivice注解的bean
{@Filter(type = FilterType.ANNOTATION,classes = {Controller.class,ControllerAdvice.class})})
但是 以上两种都没办法排除@Configuration
6.3除了上边通过的注解排除和包含,还可以指定类,去排除或者包含
6.4@ComponentScan扫描之后相当于把bean放到一个map里
bean的id作为key bean作为value
bean的id就是名字 默认首字母小写 如果是@Bean注解返回的bean默认是方法名
7.多实例与单实例的区别
scope默认singleton 多实例需要配置@Scope("prototype")
单实例在容器启动时,就会加载这个bean 多实例在使用这个bean时候才会加载这个bean
比如我有一个多实例 在一个接口中使用到了 那我调用这个接口时候才会去读这个bean
8.懒加载
单实例情况下 如果想和多实例一样 在容器启动时候不创建对象 就用懒加载 就是@Bean注解上边加一个@Lazy注解
这样这个单实例在第一次被使用时候才加载
8.1懒加载不仅限于和@Bean一起使用,可以作用在类上
SpringBoot:使用 @Lazy 注解懒加载_HTK217的博客-CSDN博客_springboot懒加载注解
但是,需要注意的是,如果@Lazy这个注解用于@Service上,然后这个service被其他类调用,比如被@Controller调用,此时懒加载就不起作用,因为controller初始化时也要初始化其中调用的bean,想让懒加载起作用,就得在@Controller上也用上@Lazy,这样就可以做到,再调用controller时才去加载controller和service
@Service
@Lazy
public class LazyService {
public LazyService() {
System.out.println("LazyService add to ioc container");
}
public void print() {
System.out.println("lazy");
}
}
@RestController
@RequestMapping("/v1/lazy")
@Lazy
public class LazyController {
@Autowired
private LazyService lazyService;
@GetMapping("/test")
public String test() {
lazyService.print();
return "Hello, world";
}
}
9.@Conditional注解
Spring_总结_04_高级配置(二)之条件注解@Conditional-布布扣-bubuko.com
@Conditionnal 能根据特定条件来控制Bean的创建行为
@Conditional注解可以用到带有@Bean注解的方法上,如果给定的条件计算结果为true,就会创建这个bean,否则,忽略这个bean
【Spring注解系列04】@Condition条件注解_Java仗剑走天涯-CSDN博客
代码和场景如下
@Configuration
public class ConditionalConfig {
/**
* @Conditional({Condition}) : 按照一定的条件进行判断,满足条件给容器中注册bean
*
* 如果系统是windows,给容器中注册("bill")
* 如果是linux系统,给容器中注册("linus")
*/
//* 条件化地创建Bean
//* 若满足WindowsCondition的条件,则创建此Bean,否则忽略此bean.
@Conditional(WindowsCondition.class)
@Bean("bill")
public Person bill(){
return new Person("111","Bill Gates");
}
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person linus(){
return new Person("222","linus");
}
}
@Condition后边跟的条件类要实现condition接口
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// TODO是否linux系统
//1、能获取到ioc使用的beanfactory
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2、获取当前环境信息
Environment environment = context.getEnvironment();
if (environment.getProperty("os.name").contains("Linux")){
return true;
}
//想模拟linux 可以在VM OPTIONS中配置
return false;
}
}
模拟linux
至于这个-D什么作用
JVM启动参数 -D作用_wangpeng322的博客-CSDN博客
Set a system property value. If value is a string that contains spaces, you must enclose the string in double quotes:
也就是说-D是用来在启动一个java程序时设置系统属性值的
10.@Import和@ImportResource
用@Import来导入配置类或者导入一个带有@Component等注解要放入Spring容器中的类;
一般用到在@Configuration中导入第三方的class 跟@Bean有那么一点像
用@ImportResource来导入一个传统的xml配置文件 如:
@ImportResource({"classpath*:sofaboot-plat-parameters-client.xml"})
11.@Bean和@Component
公共点:都是注册成bean
区别:使用到第三方jar包中的类,需要注册成bean,只能用@Bean
比如用RedisTemplate
@Configuration
public class CacheConfig extends CachingConfigurerSupport {
@ConditionalOnMissingBean(RedisTemplate.class)
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer keySerializer, RedisSerializer valueSerializer) {
// 配置key、value使用的序列化工具类
RedisTemplate template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory);
template.setKeySerializer(keySerializer);
template.setValueSerializer(valueSerializer);
template.setHashKeySerializer(keySerializer);
template.setHashValueSerializer(valueSerializer);
template.afterPropertiesSet();
return template;
}
}
自己写的类,想注册成bean,一般用@Component
如果在配置类里边,用到其他的bean,用@Bean
@Configuration
public class FlowableListenerConfig {
@Bean
public TaskDeleteListener taskCompletedListener() {
return new TaskDeleteListener();
}
}
12.构造方法
创建bean时使用,所以每个bean都会有一个默认的无参构造方法
比如在容器初始化时,就会调用bean的构造方法
13.@Bean指定初始化方法和销毁方法
@Bean(initMethod="",destroyMethod="")
https://jingyan.baidu.com/article/eae0782753878c1fec548502.html
public class Car {
public Car() {
System.out.println("car constructor...");
}
public void init() {
System.out.println("car init()");
}
public void destroy() {
System.out.println("car destory()");
}
}
@Configuration
public class MainConfigOfLifeCycle {
@Bean(initMethod="init",destroyMethod="destroy")
public Car car() {
return new Car();
}
}
先构造 再初始化 最后销毁
bean生命周期的简单理解
bean的创建(new) ----初始化(赋值)----销毁(destroy)
14.tomcat与jdk
新学到一个知识点,tomcat启动,是把东西丢到JVM里,所以没有jdk是启动不了tomcat的
jdk jvm关系
jdk>jre>jvm
JDK(Java Development Kit) 是 Java 语言的软件开发工具包(SDK)。
在JDK的安装目录下有一个jre目录,里面有两个文件夹bin和lib,
在这里可以认为bin里的就是jvm,lib中则是jvm工作所需要的类库,
而jvm和 lib合起来就称为jre。
15.看容器源码的顺序,反正我也没看懂
BeanPostProcesser原理
至于属性赋值,我理解可能成员变量或者@Value需要赋初值,再或者以前beans.xml中经常写property="",value="" 用value给这个属性赋值
容器加载顺序(同样我也没试过)
16.@primary
spring @Primary-在spring中的使用_小猪奋斗-CSDN博客_@primary
一个接口有多个实现类,注入这个接口时候默认注入带@primary的那个实现类
我觉得,一个类被多个子类继承,也可以用@primary标识默认注入的
两者同时存在时,并不冲突,@Qualifier还是按照名字找,找不到时,取到@Pirmary
还有一种用法:配置多个数据源时指定主数据源
17.@value
还可以用spring的el表达式#{}
@Value("#{20-2}")
private Integer age;
@Value("${wish.plat.idgeneration.url:127.0.0.1:12200}")
private String url;
Spring @Value("#{}")和@Value("${}")_SihgYu-CSDN博客
@RestController
@RequestMapping("/login")
@Component
public class LoginController {
@Value("#{1}")
private int number; //获取数字 1
@Value("#{'Spring Expression Language'}") //获取字符串常量
private String str;
@Value("#{dataSource.url}") //获取bean的属性
private String jdbcUrl;
@Autowired
private DataSourceTransactionManager transactionManager;
@RequestMapping("login")
public String login(String name,String password) throws FileNotFoundException{
System.out.println(number);
System.out.println(str);
System.out.println(jdbcUrl);
return "login";
}
}
18.@mapper与mybatis:mapper-locations
@Mapper或者@MapperScan扫描mapper,
mybatis:mapper-locations扫描xml文件
怎么注册成bean?我的理解:通过mybatis-spring中间件,把扫描到的注册成bean
19.@Autowired注入:首先按照id找,再按照类型找
@Autowired
private TestDao testDao;
@Bean("testDao1")
publict class TestDao{
}
@Configuration
public class Config{
@Bean("testDao2")
public TestDao testDao(){
}
}
此时,按照testDao找不到,就按照类型找,多个时,通过@Pirmary或者@Qulifier
20.@Autowired(required=false)
bean不存在时也不报错