在上一篇文章中,我们谈到了使用@Configuration annotation结合@Bean annotation在容器中注册组件,以及Spring Boot带来的两种配置模式,即Full模式和Lite模式。在本文中,我们来谈谈在容器中注册组件的其他方法,因为我们以前的方法也可以使用!例如,我们可以用@Component注释来标记一个类,以表明该类是一个组件,或者用@Controller注释来表明它是一个控制器,或者用@Service注释来表明它是一个业务逻辑组件,或者用@Repository注释来表明它是一个数据访问层组件。仍然可以使用这些以前的注释,并且默认使用这些组件。我们默认扫描的包是com.meimeixia.boot,这是主配置类(也叫主程序类或主类)所在的包。除了在主配置类中编写配置之外,我们还可以使用@Configuration注释定制一些配置类。我们以前就是这么做的,记得吗?这些注释@Component、@Controller、@Service和@Repository,包括注释@ComponentScan,我就不赘述了。你知道,我们可以通过这个注释来指定包扫描规则。这些注释相信大家之前都用过,这里就不赘述了。接下来,我将介绍另一种向容器添加组件的方法,即使用@Import注释将组件导入容器。那么,@Import评论应该写在哪里呢?只要我们把它写在任何配置类或者组件里,都是可行的。注意@Import标注要写在容器中组件的类上,可以是配置类,也可以是其他标注标注的类(比如@Component、@Controller、@Service和@Repository)。简而言之,容器中组件的类别只要是就可以了。在这里,我们不妨在MyConfig配置类上标记它。@Import标注的作用是什么?一听它的意思就知道是用来导入组件的。我们不妨点进这个注释的源代码看一下,如下图所示。
发现里面有一个Class type array的属性,就是我们可以通过@Import注释将很多组件导入到容器中。例如,我们可以将自己的组件导入到容器中,比如用户类型的组件。此外,我们还可以将一些第三方jar包导入到容器中。我们不妨随便找一个从我们maven项目导入的第三方jar包,就是logback-core-1.2.3.jar!
您可以导入jar包中任何类的对象。尝试在jar包中导入DBHelper类的对象。
让我们看看是否可以将DBHelper类的对象导入到容器中,如下所示,我们发现可以。
包com。梅夏美。靴子。配置;导入栗色服务质量。返回日志。核心。db。db助手;导入com。美美侠。靴子。比恩。宠物;导入com。梅夏美。靴子。比恩。用户;导入org。spring框架。语境。注释。豆;导入org。spring框架。语境。注释。配置;导入org。spring框架。语境。注释。进口;/* * * * @作者lia yun * @ create 2023-04-23 19:42 * */@ Import({ user。class,DBHelper.class}) //这时,就会给容器中自动创建出这两个类型的组件了@ Configuration(proxy bean methods=true)//告诉Spring Boot这是一个配置类==配置文件公共类MyConfig { @Bean //@Bean注解是给容器中添加组件的。添加什么组件呢?以方法名作为组件的id,返回类型就是组件类型,返回的值就是组件在容器中的实例公共用户user01() {用户张三=新用户('张三'18);//用户类型的组件依赖了宠物类型的组件张三。setset(Tomcat pet());回报张三;} @Bean('汤姆')公共宠物tomcatPet() {返回新宠物(‘Tomcat’);}}此时,@Import({User.class,DBHelper.class})注解就会给容器中自动创建出用户和DBHelper这两个类型的组件,注意,调用的是这两个类中的无参构造器来创建出的对象并放在容器中的哟!那不妨我们现在来看一下容器中到底会不会有这两个组件?怎么验证呢?不就是从容器中获取组件吗,这有什么难的,但问题就是我们给容器中放了非常多用户这种类型的组件,那咋个办呢?我们可以在主程序类中编写下面这样的代码来进行验证。
包com。美美侠。开机;导入栗色服务质量。返回日志。核心。db。db助手;导入com。美美侠。靴子。比恩。宠物;导入com。梅夏美。靴子。比恩。用户;导入com。梅夏美。靴子。配置。我的配置;导入org。spring框架。靴子。春季申请;导入org。spring框架。靴子。弹簧靴配置;导入org。spring框架。靴子。自动配置。启用自动配置;导入org。spring框架。语境。可配置的应用程序上下文;导入org。spring框架。语境。注释。组件可以;/** * 主程序类,也叫主配置类* @作者lia yun * @ create 2023-04-19 4:02 *///@ spring boot应用程序@ spring boot configuration @ enable auto configuration @ components can(' com美美侠。boot’)公共类主应用{ public static void main(String[]args){//1。返回国际奥委会容器,国际奥委会容器里面就包含了当前应用的所有组件ConfigurableApplicationContext run=spring应用程序。运行(主应用程序。class,args);//这是固定写法哟//2.我们可以来查看下国际奥委会容器里面所有的组件,只要能查找到某一个组件,就说明这个组件是能工作的,至于怎么工作,这就是我们后来要阐述的原理了string[]names=run。get bean definition names();//获取所有组件定义的名字for(String name:names){ system。出去。println(名称);} //3.从容器中获取组件Pet tom01=run.getBean('tom 'Pet。类);Pet tom02=run.getBean('tom 'Pet。类);System.out.println('组件是否为单实例:'(Tom 01==Tom 02));//配置类打印:com。梅夏美。靴子。配置。我的配置$ $ enhancerbyspringlib $ $ 4559 f04d @ 49096 b06我的配置bean=run。获取bean(我的配置。类);系统。出去。println(bean);//如果@ Configuration(proxy bean methods=true),代理对象调用方法用户user=bean。用户01();用户用户1=bean。用户01();系统。出去。println('(user==user 1)='(user==user 1));用户user01=run.getBean('user01 '用户。类);Pet tom=run.getBean('tom 'Pet。类);System.out.println('用户的宠物:'(用户01。get pet()==Tom));//4.获取组件系统。出去。println('=================');string[]beanNamesForType=run。getbeannamesfortype(用户。类);//获取我们给容器中注册的用户类型的组件的名字for(String s:beanNamesForType){ system .出去。println(s);} db helper bean 1=运行。获取bean(数据库助手。类);系统。出去。println(bean 1);}}然后,我们运行主程序类,发现想法控制台打印结果如下。
可以看到,在容器中,有一个名为com.meimeixia.boot.bean.User的组件和另一个名为user01的组件。为什么会有这两个成分?名为user01的组件是使用@Bean方法添加的,而另一个名为com.meimeixia.boot.bean.User的组件是使用@Import注释导入的。从这个角度来看,默认情况下,用@Import注释导入的组件的名称是它的完整类名。此外,我们还获得了使用@Import注释导入的DBHelper类型的组件。
作者:云原文链接: