JAVA面试题分享五百四十一:Spring获取Bean的方式有哪些?热加载、热部署的三种方式?

目录

Spring获取Bean的方式

1.基于注解获取Bean

2.基于BeanFactory获取Bean

3.基于ApplicationContext获取bean

热加载、热部署

1、IDEA热加载

2、springboot-devtools(⭐⭐⭐⭐)

3、jrebel插件(⭐⭐⭐)

4、调试小技巧

5、总结


Spring获取Bean的方式

在Spring中,Bean的实例化、定位、配置应用程序中的对象及建立对象间的依赖关系,都是在IoC容器中进行的。因此,要在Spring中获取Bean,本质上就是从IoC容器当中获取Bean。

那获取Bean的方式有哪些呢?我们总结整理了以下几点:

  • 1、基于注解获取Bean

  • 2、基于BeanFactory获取Bean

  • 3、基于ApplicationContext获取bean

1.基于注解获取Bean

我们最常见的使用方式,应该就是通过注解获取Bean了。

@Componentpublic class SpringContextUtil {        @Autowired    private SysUserService sysUserService;        public void test(){        sysUserService.test();    }}

例如使用@Autowired注解来注入sysUserService 。

2.基于BeanFactory获取Bean

存在一些场景,我们无法通过注解来获取bean的时候,可以选择基于BeanFactory来获取。

@Componentpublic class SpringContextUtil implements BeanFactoryAware {
    private static BeanFactory beanFactory;
    @Override    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {        this.beanFactory = beanFactory;    }
    public static <T> T getBean(Class<T> requiredType) {        return beanFactory.getBean(requiredType);    }}

通过实现BeanFactoryAware接口,重写setBeanFactory方法,来给本地属性beanFactory赋值,在后续的使用过程中,直接通过调用SpringContextUtil.getBean()即可实现bean的获取。

3.基于ApplicationContext获取bean

通过ApplicationContext的方式获取bean,我们列举一种比较常见的方式。

@Componentpublic class SpringContextUtil implements ApplicationContextAware {
    private static ApplicationContext applicationContext;
    @Override    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {        this.applicationContext = applicationContext;
    }    public static <T> T getBean(Class<T> clazz) {        T bean = applicationContext.getBean(clazz);        return bean;    }}

通过实现ApplicationContextAware接口,在Spring容器启动时将ApplicationContext注入进去,在后续的使用过程中,直接通过调用SpringContextUtil.getBean()即可实现bean的获取。

在整理Spring中通过ApplicationContext获取bean的内容的时候,发现网上介绍了很多中获取bean的方式,但是总结下来看,其实本质上是相似的,例如:

  • 1、继承ApplicationObjectSupport类

  • 2、继承WebApplicationObjectSupport类

底层都是通过implements ApplicationContextAware的方式,来获取ApplicationContext,从而通过getBean()获取bean对象。

热加载、热部署

1、IDEA热加载

1)、自带功能(推荐⭐⭐⭐⭐)

其实IDEA功能强大,已经自带了热加载,而且使用方便。它的使用方法也很简单,首先保证是自动编译:

File->Settings->Build->Compiler,勾选build project automatically

图片

如果是老版本还需要修改:

按快捷键Ctrl+Alt+Shift+/ (如果出来Registry…则点击进入),勾选compiler.automake.allow.when.app.running

修改代码后,按ctrl+shift+f8(编译当前文件)即可。

缺陷:只能对修改已有方法生效,如果启动后新建方法则不生效。会给出下面的提示:

图片

评价:方便可控!速度快!就是修改范围有限!

2)、自动更新(推荐⭐⭐)

配置失去焦点时自动更新,比如切换窗口就生效,无需手动按ctrl+shift+f8。

图片

评价:看似方便,实际用起来体验并不好,有时候并没有改什么,你要切窗口的时候,它也更新弹出提示窗口,实在烦人。

2、springboot-devtools(⭐⭐⭐⭐)

1)、添加依赖:

  <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-devtools</artifactId>            <!--开发测试阶段-->            <scope>provided</scope>            <optional>true</optional>        </dependency>

2)、启动类的main方法中可以手动控制:

System.setProperty("spring.devtools.restart.enabled", "true");

也可以配置在application.properties

spring.devtools.restart.enabled=false

3)、自定义资源路径

默认情况下,/META-INF/maven、/MET A-INF/resources、/resources、/static 、/public 以及 /templates位置下资源的变化并不会触发重启,如果开发者想要对这些位置进行重定义 ,在 application.properties 中添加如下配置即可:

spring.devtools.restart.exclude=static/**

4)、需要添加插件才能生效

   <plugin>                <!--springbootmaven编译,可以编译出可执行jar,可以让springbootdevtools生效-->                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-maven-plugin</artifactId>                <configuration>                    <excludes>                        <exclude>                            <groupId>org.projectlombok</groupId>                            <artifactId>lombok</artifactId>                        </exclude>                    </excludes>                    <!--fork:  如果没有该项配置,devtools不会起作用,即应用不会restart -->                    <fork>true</fork>                    <addResources>true</addResources>                    <!-- springboot devtools配置 end-->                </configuration>   </plugin>

使用起来也简单,就是切换窗口的时候,就会自动重启服务。与直接启动的区别在于它的重新启动并不是完整的重启整个应用,而是只重启我们的应用代码。

评价:和idea自带热更新相比,这个方式毕竟是重启,所以新建方法和修改xml语句都是能够生效的。

3、jrebel插件(⭐⭐⭐)

  因为是收费,并且效果没有显著提升。

  jrebel号称比springboot-devtools更快,因为它是更新修改过文件,而springboot-devtools应该是更新应用代码,不过jrebel是收费的。

jrebel不止可以用在springboot项目,java项目都可以使用。

个人使用感受:可能是项目还不够大,所以感觉跟springboot-devtools差别不大,后来升级了IDEA后就没再用了。

4、调试小技巧

顺带说一下,鲜为人知的小技巧。

alt+鼠标左键点击在方法上可以重复调用方法。

图片

此时如果修改了数据库数据,再次按下alt+鼠标左键,数据就会变,并且是实际执行了一次。

数据修改后的变化:

图片

5、总结

  个人最常用的是利用IDEA自带热加载,虽然有局限只能在已有的方法内才生效,但是好在够快!

怎么抉择?

  新增接口或者明确需要添加很多新方法,以及需要时不时新建Mybatis的xml时,用springboot-devtools。

System.setProperty("spring.devtools.restart.enabled", "true");

其他小规模修改时,用IDEA自带热加载,把上面属性改成false即可。

有一说一,我的评价是不如前端的nodejs快,哈哈哈~~~~

  • 13
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

之乎者也·

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值