spring--享学课堂

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不存在时也不报错

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值