0


Spring:xml 配置

Bean

在这里插入图片描述

配置

在 Spring 中,配置 bean 实例一般使用 xml 配置方式或注解(Annontation)配置方式。

xml 配置

在 xml 配置中分为三种方式,分别为反射模式、工厂方法模式和 Factory Bean 模式。

反射模式:指通过指定 bean 的 class 属性值来创建对象(最为常用,前面的文章一直使用该模式)
工厂方法模式:指通过反射机制获取 Factory 类,再利用 Factory 类来创建对象
Factory Bean 模式:指通过实现 FactoryBean 接口中的 getObject() 方法来返回 bean 对象实例。通常 Factory Bean 模式用来配置第三方框架中的 bean 对象

反射模式

反射模式在 bean 配置中需要配置 bean 对象的全类名。

<beanid="beanObject"class="cn.edu.springdemo.beanDemo.beanObject"p:instance="beanObject"/>

工厂方法模式

工厂方法分为静态工厂方法实例工厂方法工厂方法模式简单了解即可

静态工厂方法指 Factory 类本身不需要实例化,但其提供了一个静态方法来创建对象。

简单示例:
创建一个学科类:

packagecn.edu.springdemo.beanDemo;//学科类publicclassDiscipline{privateint id;privateString discipline;publicDiscipline(){super();}publicDiscipline(int id,String discipline){this.id = id;this.discipline = discipline;}publicintgetId(){return id;}publicStringgetDiscipline(){return discipline;}publicvoidsetId(int id){this.id = id;}publicvoidsetDiscipline(String discipline){this.discipline = discipline;}@OverridepublicStringtoString(){return"Discipline{"+"id="+ id +", discipline='"+ discipline +'\''+'}';}}

创建一个对应学科类的静态工厂类:

packagecn.edu.springdemo.beanDemo;importjava.util.HashMap;importjava.util.Map;publicclassDisciplineStaticFactory{privatestaticMap<Integer,Discipline> map =newHashMap<Integer,Discipline>();//静态 bean 容器,存储学科类对象的集合static{
        map.put(1,newDiscipline(20230502,"计算机"));
        map.put(2,newDiscipline(20230504,"数学"));
        map.put(3,newDiscipline(20230506,"英语"));}//提供一个静态方法,根据其 id 获取对应的对象publicstaticDisciplinegetDiscipline(int id){return map.get(id);}}

xml配置:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- id为学科类的一个实例;但 class 属性指向的是静态工厂类;factory-method 属性指向的是静态工厂类的静态方法 --><beanid="math"class="cn.edu.springdemo.beanDemo.DisciplineStaticFactory"factory-method="getDiscipline"><!-- 给静态工厂类的静态方法传递参数 --><constructor-argvalue="2"></constructor-arg></bean></beans>

测试结果:

packagecn.edu.springdemo.test;importcn.edu.springdemo.beanDemo.Discipline;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;publicclassAdminTest{publicstaticvoidmain(String[] args){ApplicationContext applicationContext =newClassPathXmlApplicationContext("beanConfiguration.xml");Discipline discipline =(Discipline) applicationContext.getBean("math");System.out.println(discipline);}}

结果如图:
在这里插入图片描述

实例工厂方法指通过实例工厂对象来调用 getBean 方法获取 bean 对象。

简单示例:
与学科类一样,再创建一个对应学科类的实例工厂类:

packagecn.edu.springdemo.beanDemo;importjava.util.HashMap;importjava.util.Map;publicclassDisciplineInstanceFactory{privateMap<Integer,Discipline> map =newHashMap<>();publicvoidsetMap(Map<Integer,Discipline> map){this.map = map;}//根据其 key 获取对应的对象publicDisciplinegetDiscipline(int key){return map.get(key);}}

xml配置:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 配置工厂实例 --><beanid="disciplineInstanceFactory"class="cn.edu.springdemo.beanDemo.DisciplineInstanceFactory"><propertyname="map"><map><entrykey="1"><beanclass="cn.edu.springdemo.beanDemo.Discipline"p:id="20230502"p:discipline="计算机"/></entry><entrykey="2"><beanclass="cn.edu.springdemo.beanDemo.Discipline"p:id="20230504"p:discipline="数学"/></entry><entrykey="3"><beanclass="cn.edu.springdemo.beanDemo.Discipline"p:id="20230506"p:discipline="英语"/></entry></map></property></bean><!-- 配置获取相应的实例 --><beanid="math"factory-bean="disciplineInstanceFactory"factory-method="getDiscipline"><constructor-argvalue="2"></constructor-arg></bean></beans>

结果如图:
在这里插入图片描述

Factory Bean 模式

Factory Bean 模式中需要实现 Factory Bean 接口,其中包括三个方法:getObject() 、getObjectType() 、isSingleton() 。

简单示例:
与学科类一样,再创建一个 Factory Bean 接口实现类:

packagecn.edu.springdemo.beanDemo;importorg.springframework.beans.factory.FactoryBean;publicclassDisciplineFactoryBeanimplementsFactoryBean<Discipline>{privateint id;privateString discipline;//set 方法publicvoidsetId(int id){this.id = id;}publicvoidsetDiscipline(String discipline){this.discipline = discipline;}//返回配置的 bean 对象实例@OverridepublicDisciplinegetObject()throwsException{returnnewDiscipline(id,discipline);}//返回配置的 bean 对象的类型@OverridepublicClass<?>getObjectType(){returnDiscipline.class;}//是否为单例@OverridepublicbooleanisSingleton(){returntrue;}}

xml配置:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:p="http://www.springframework.org/schema/p"xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 通过 FactoryBean 配置 bean 实例,getObject() 方法返回 --><beanid="math"class="cn.edu.springdemo.beanDemo.DisciplineFactoryBean"p:id="20230514"p:discipline="math"/></beans>

结果如图:
在这里插入图片描述

另外,使用 Factory Bean 模式将 Quartz框架(第三方框架)整合到 Spring 中。Quartz 是一个完全由 Java 编写的开源作业调度框架,可以用来创建简单或运行十个、百个,甚至是好几万个 Jobs 这样复杂的程序。

简单示例:
先在 pom.xml 中添加以下依赖:

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context-support --><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>5.3.25</version></dependency><!-- https://mvnrepository.com/artifact/org.springframework/spring-tx --><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.3.25</version></dependency><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>2.0.6</version></dependency><!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-nop --><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-nop</artifactId><version>2.0.6</version><type>jar</type></dependency><!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.3.2</version></dependency>

xml配置:

<?xml version="1.0" encoding="UTF-8"?><beansxmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><!-- 定义工作任务Job --><beanname="quartzJob"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><!-- 指定 Job 名称 --><propertyname="name"value="QuartzJob"/><!-- 指定 Job 分组 --><propertyname="group"value="QuartzJobGroup"/><!-- 指定 Job 接口实现类 --><propertyname="jobClass"value="cn.edu.springdemo.beanDemo.QuartzJob"/><!-- 指定 value 值必须为 true ,否则 Job 执行完成后不会再继续 --><propertyname="durability"value="true"/><!-- 指定 spring 容器的 Key --><propertyname="applicationContextJobDataKey"value="QuartzJob"/></bean><!-- 定义与工作任务绑定的触发器Trigger --><beanid="cronTrigger"class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><!-- 指定 Trigger 名称 --><propertyname="name"value="CronTrigger"/><!-- 指定 Trigger 分组 --><propertyname="group"value="CronTriggerGroup"/><!-- 指定 Trigger 绑定的工作任务  --><!-- 多个工作任务用 jobDataMap --><propertyname="jobDetail"ref="quartzJob"/><!-- 指定 CronExpression 表达式,每隔多长时间执行一次 --><!--
             写法:秒 分 时 日 月 周 年
             通配符:*表示所有值;
                     ?表示不定值;
                     -表示区间;
                     ,表示指定多个值;
                     /表示从某个时间开始,每隔一段时间触发一次
        --><!-- 从十秒开始,每隔8秒触发一次 --><propertyname="cronExpression"value="10/8 * * * * ?"/></bean><!-- 定义调度器,将 Trigger 注册到 Scheduler --><beanid="scheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><propertyname="triggers"><list><refbean="cronTrigger"/></list></property></bean></beans>

再创建一个 Job 接口的实现类:

packagecn.edu.springdemo.beanDemo;importorg.quartz.Job;importorg.quartz.JobExecutionContext;importorg.quartz.JobExecutionException;publicclassQuartzJobimplementsJob{@Overridepublicvoidexecute(JobExecutionContext jobExecutionContext)throwsJobExecutionException{System.out.println("定时执行的工作任务");}}

测试结果:

packagecn.edu.springdemo.test;importorg.springframework.context.ApplicationContext;importorg.springframework.context.support.ClassPathXmlApplicationContext;importorg.springframework.scheduling.quartz.SchedulerFactoryBean;publicclassQuartzJobTest{publicstaticvoidmain(String[] args){ApplicationContextQuartzJob=newClassPathXmlApplicationContext("QuartzJob.xml");SchedulerFactoryBean scheduler =QuartzJob.getBean(SchedulerFactoryBean.class);
        scheduler.start();}}

结果如图:
在这里插入图片描述

标签: Spring Bean xml 配置

本文转载自: https://blog.csdn.net/qq_56886142/article/details/130464424
版权归原作者 啊Q老师 所有, 如有侵权,请联系我们删除。

“Spring:xml 配置”的评论:

还没有评论