annotation-config自动装配
本文系作者原创,转载请注明出处:http://www.cnblogs.com/further-further-further/p/7716678.html
解决问题
通过spring XML配置文件,实现类对象之间松耦合
前提条件
使用的bean必须在spring容器中已注册过
内容说明
1、 使用@Autowired注解自动装配时,需在XML配置文件中引入 <context:annotation-config/>;
2、 存在多个bean满足装配属性,需用@Qualifier指定唯一的bean,否则会报异常;
Guitar和Saxophone都实现了Instrument接口,Instrumentalist存在一个属性类型为Instrument,
所以Instrumentalist满足装配Instrument属性的bean就有 Guitar和Saxophone,所以必须指定唯一的bean;
3、 bean 的id不指定时,默认类名小写;
例如<bean class="com.spring.example.annotation.config.Guitar"/> 因为id没有指明,所以默认为guitar;
应用实例(包名:com.spring.example.annotation.config)
spring配置文件 annotation-config.xml 如下:
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 6 7 <!--<!–使用基于注解自动装配 @Autowired @Inject @Resource–>--> 8 <context:annotation-config/> 9 10 11 12 <!--限定歧义性的依赖,使用@Autowired注解自动装配,满足装配的多个bean, 13 可以通过@Qualifier指定来缩小范围 默认byType 14 Guitar和Saxophone都实现了Instrument,所以有多个bean满足Instrumentalist注入属性, 15 需要指定唯一bean,用@Qualifier("guitar")指定,否则会报异常 16 --> 17 18 <bean id ="guitar" class="com.spring.example.annotation.config.Guitar"/> 19 <bean id ="saxophone" class="com.spring.example.annotation.config.Saxophone"/> 20 <bean id ="kenny" 21 class="com.spring.example.annotation.config.Instrumentalist"> 22 <property name="song" value="Jingle Bells3" /> 23 </bean> 24 25 </beans>
Instrument接口代码
public interface Instrument { void play(); }
Guitar实现接口Instrument代码
public class Guitar implements Instrument { @Override public void play() { System.out.println("Guitar...."); } }
Saxophone实现接口Instrument代码
public class Saxophone implements Instrument { @Override public void play() { System.out.println("Saxophone ......"); } }
Performer接口代码
public interface Performer { void perform(); }
Instrumentalist实现接口Performer代码
public class Instrumentalist implements Performer { public Instrumentalist(){} @Value("Yesterday Once more !") //song 初始化值 private String song; // @Autowired 可以装配属性、方法、构造函数,只要类型相同(这里是Instrument类型) @Autowired @Qualifier("guitar") //spring容器中有多个bean满足要求,需要指定bean private Instrument instrument; public void setSong(String song) { this.song = song; } public void setInstrument(Instrument instrument){ this.instrument = instrument ; } @Override public void perform() { System.out.println("Playing "+ song + " : "); instrument.play(); } }
测试代码
public class Driver extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { try { ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/annotation-config.xml"); Performer performer = (Performer) ctx.getBean("kenny"); performer.perform(); }catch (Exception e){ e.printStackTrace(); } } }
运行结果
总结
annotation-config下@Autowired自动装配自然也有其优缺点:
优点:实现类对象之间松耦合,
缺点:需要在spring配置文件中需提前手动指明bean,增加XML文件繁琐冗余性;
在业务逻辑开发中不能将业务类自动注入spring容器,遇到业务类的更改,配置文件也不得不更改,增加出错概率;
component-scan能解决此问题,会在下节讲述;
应用场景
调用第三方接口,装配注入相应实例bean;
本文描述可能有不对或不全之处,欢迎大家吐槽!
不要让懒惰占据你的大脑,不要让妥协拖垮你的人生。青春就是一张票,能不能赶上时代的快车,你的步伐掌握在你的脚下。