17、Spring Boot普通类调用bean【从零开始学Spring Boot】

编程知识 更新时间:2023-04-05 05:03:25

 

【视频 & 交流平台】

à SpringBoot视频

http://study.163/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye/blog/2321532

 



 

 


我们知道如果我们要在一个类使用spring提供的bean对象,我们需要把这个类注入到spring容器中,交给spring容器进行管理,但是在实际当中,我们往往会碰到在一个普通的Java类中,想直接使用spring提供的其他对象或者说有一些不需要交给spring管理,但是需要用到spring里的一些对象。如果这是spring框架的独立应用程序,我们通过

ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId"); 

这样的方式就可以很轻易的获取我们所需要的对象。

但是往往我们所做的都是Web Application,这时我们启动spring容器是通过在web.xml文件中配置,这样就不适合使用上面的方式在普通类去获取对象了,因为这样做就相当于加载了两次spring容器,而我们想是否可以通过在启动web服务器的时候,就把Application放在某一个类中,我们通过这个类在获取,这样就可以在普通类获取spring bean对象了,让我们接着往下看。

 

普通类调用Spring bean对象:

可以参考:http://412887952-qq-com.iteye/blog/1479445

这里有更多这方面的介绍,比较详细,在这里只是抛装引玉说明在Spring Boot是如何进行调用的。

 

 

17.1 在Spring Boot可以扫描的包下

     假设我们编写的工具类为SpringUtil

     如果我们编写的SpringUtil在SpringBoot可以扫描的包下或者使用@ComponentScan引入自定义的包了,那么原理很简单,只需要使得SpringUtil实现接口:ApplicationContextAware,然后加上@Component 注解即可,具体编码如下:

com.kfit.base.util.SpringUtil:

package com.kfit.base.util;

 

import org.springframework.beans.BeansException;

importorg.springframework.context.ApplicationContext;

importorg.springframework.context.ApplicationContextAware;

importorg.springframework.stereotype.Component;

 

/**

 *普通类调用Spring bean对象:

 *说明:

 * 1、此类需要放到App.java同包或者子包下才能被扫描,否则失效。

 *@author Administrator

 */

@Component

publicclass SpringUtilimplementsApplicationContextAware{

       privatestaticApplicationContextapplicationContext =null;

 

       @Override

       publicvoidsetApplicationContext(ApplicationContextapplicationContext)throws BeansException{

              if(SpringUtil.applicationContext ==null){

                     SpringUtil.applicationContext  =applicationContext;

              }

              System.out.println("---------------------------------------------------------------------");

              System.out.println("---------------------------------------------------------------------");

       System.out.println("---------------com.kfit.base.util.SpringUtil------------------------------------------------------");

              System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringUtil.applicationContext+"========");

              System.out.println("---------------------------------------------------------------------");

       }

      

       //获取applicationContext

       publicstaticApplicationContext getApplicationContext() {

              returnapplicationContext;

       }

      

       //通过name获取 Bean.

       publicstatic ObjectgetBean(Stringname){

              returngetApplicationContext().getBean(name);

       }

      

       //通过class获取Bean.

       publicstatic <T> TgetBean(Class<T>clazz){

              returngetApplicationContext().getBean(clazz);

       }

      

       //通过name,以及Clazz返回指定的Bean

       publicstatic <T> TgetBean(Stringname,Class<T> clazz){

              returngetApplicationContext().getBean(name,clazz);

       }

}

 

启动应用,查看控制台的打印信息是否有:

======ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,

17.2 不在Spring Boot的扫描包下方式一

     这种情况处理起来也很简单,先编写SpringUtil类,同样需要实现接口:ApplicationContextAware,具体编码如下:

simple.plugin.spring.SpringUtil

package simple.plugin.spring;

 

importorg.springframework.beans.BeansException;

import org.springframework.context.ApplicationContext;

importorg.springframework.context.ApplicationContextAware;

 

publicclass SpringUtilimplementsApplicationContextAware{

       privatestaticApplicationContextapplicationContext =null;

 

       @Override

       publicvoid setApplicationContext(ApplicationContextapplicationContext)throws BeansException{

              if(SpringUtil.applicationContext ==null){

                     SpringUtil.applicationContext  =applicationContext;

              }

              System.out.println("---------------------------------------------------------------------");

              System.out.println("---------------------------------------------------------------------");

       System.out.println("---------------simple.plugin.spring.SpringUtil------------------------------------------------------");

              System.out.println("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext="+SpringUtil.applicationContext+"========");

              System.out.println("---------------------------------------------------------------------");

       }

      

       //获取applicationContext

       publicstaticApplicationContext getApplicationContext() {

              returnapplicationContext;

       }

      

       //通过name获取 Bean.

       publicstatic ObjectgetBean(Stringname){

              returngetApplicationContext().getBean(name);

       }

      

       //通过class获取Bean.

       publicstatic <T> TgetBean(Class<T>clazz){

              returngetApplicationContext().getBean(clazz);

       }

      

       //通过name,以及Clazz返回指定的Bean

       publicstatic <T> TgetBean(Stringname,Class<T> clazz){

              returngetApplicationContext().getBean(name,clazz);

       }

}

 

之后这一步才是关键,使用@Bean注解,在App.java类中将SpringUtil注解进来,代码如下:

package com.kfit;

 

import org.springframework.boot.SpringApplication;

importorg.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.boot.web.servlet.ServletComponentScan;

import org.springframework.context.annotation.Bean;

import org.springframework.context.annotation.Import;

 

import simple.plugin.spring.SpringUtil;

 

/**

 * Hello world!

 *

 */

//其中@SpringBootApplication申明让spring boot自动给程序进行必要的配置,等价于以默认属性使用@Configuration,@EnableAutoConfiguration和@ComponentScan

@SpringBootApplication

@ServletComponentScan

 

public class App {

      

       /**注册Spring Util

        *这里为了和上一个冲突,所以方面名为:springUtil2

        *实际中使用springUtil

        */

       @Bean

       public SpringUtilspringUtil2(){return new SpringUtil();}

      

       /**

        *

     参数里VM参数设置为:

       -javaagent:.\lib\springloaded-1.2.4.RELEASE.jar-noverify

        * @param args

        */

       public static voidmain(String[] args) {

              SpringApplication.run(App.class,args);

       }

}

 

 

17.3 不在Spring Boot的扫描包下方式二

代码基本和上面都是相同的,主要是在App.java中使用@Import进行导入。

而且在SpringUtil不需要添加@Component注解

@SpringBootApplication

@ServletComponentScan

@Import(value={SpringUtil.class})

public class App{

       //省略其它代码.

}

 

说明以上3中方式都生效了,这3中方式根据实际情况选择一种方式就可以了。

 

那么这样子在普通类既可以使用:

SpringUtil.getBean() 获取到Spring IOC容器中的bean。

当然也可以在Spring管理的类中使用:

@Resouce或者@Autowired进行注入使用,当然我们这个类的核心是普通类可以调用spring的bean进行使用了,是不是很神奇呢。


Spring Boot 系列视频】

视频&交流平台:

à Spring Boot网易云课堂视频

http://study.163/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye/blog/2321532

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

历史章节

 

第一章 快速开始

1、Spring Boot之Hello World

2、Spring Boot之Hello World访问404

 

第二章 Spring Boot之JSON

1、spring boot返回json数据

2、Spring Boot完美使用FastJson解析JSON数据

 

第三章 Spring Boot热部署

1、Spring Boot热部署(springloader)

2、springboot + devtools(热部署)

 

第四章 Spring Boot数据库

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介绍

4、Spring Boot JdbcTemplate

5、Spring Boot集成MyBatis

 

第五章 web开发

1、全局异常捕捉

2、配置server信息

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot添加JSP支持

 

第六章 定时任务

1、Spring Boot定时任务

2、Spring Boot 定时任务升级篇(动态修改cron参数)

3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)

4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)

5、Spring Boot Quartz介绍

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 集成Quartz普通使用

8、Spring Boot 集成Quartz升级版

9、Spring Boot 集成Quartz二次升级版

10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象

 

第七章 Spring Boot MyBatis升级篇

1、Spring Boot MyBatis升级篇-注解

2、Spring Boot MyBatis升级篇-注解-自增ID

3、Spring Boot MyBatis升级篇-注解-增删改查

4、Spring Boot MyBatis升级篇-注解-分页查询

5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效

6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇

8、Spring Boot MyBatis升级篇-注解-@Result

9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题

12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升级篇-XML

14、Spring Boot MyBatis升级篇-XML-自增ID

15、Spring Boot MyBatis升级篇-XML-增删改查

16、Spring Boot MyBatis升级篇-XML-分页查询

17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效

18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)

19、Spring Boot MyBatis升级篇-XML-注解-初尝试

20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter

 

第八章 Spring Boot 知识点1

1、Spring Boot 拦截器HandlerInterceptor

2、Spring Boot启动加载数据CommandLineRunner

3、Spring Boot环境变量读取和属性对象的绑定

4、Spring Boot使用自定义的properties

5、Spring Boot使用自定义的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 监控和管理生产环境

 

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh文件))

 

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

 

3、Spring Boot日志-log4j2

更多查看博客: http://412887952-qq-com.iteye/



更多推荐

17、Spring Boot普通类调用bean【从零开始学Spring Boot】

本文发布于:2023-04-05 05:03:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/92456fcd60bf28386867deb6c74713c0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:从零开始   Spring   bean   Boot

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!

  • 44924文章数
  • 14阅读数
  • 0评论数