------------恢复内容开始------------
Spring中的依赖注入 1.Spring的依赖注入容器的核心是BeanFactory接口; 2.bean用于引用由容器管理的任何组件。 设置Spring配置选项 1.通过XML文件定义bean。app-contextxml.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:c="http://www.springframework.org/schema/c" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> </beans> 2.通过标记告诉Spring扫描代码,使用注解。 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" 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"> <context:component-scan base-package="org.crazyit.app.service"/> </beans> <bean id="" clas="" p:messageProvider-ref=""> 以上等价以下: @Autowired public void setMessageProvider(MessageProvider provider){} 也可以使用: @Resource(name="messageProvider") 四种通过xml获取bean的方式: ================================================= public class HelloWorldMain { public static void main(String[] args) { //defaultMethod(); //genericMethod(); //classpathMethod(); annotationMethod(); } public static void defaultMethod() { DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader xbdr = new XmlBeanDefinitionReader(factory); xbdr.loadBeanDefinitions(new ClassPathResource("/app-contextxml.xml")); MessageRender messageRender = factory.getBean("render", MessageRender.class); messageRender.render(); } public static void genericMethod() { GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("classpath:/app-contextxml.xml"); ctx.refresh(); MessageRender messageRender = ctx.getBean("render", MessageRender.class); messageRender.render(); ctx.close(); } public static void classpathMethod() { ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("app-contextxml5.xml"); MessageRender messageRender = ctx.getBean("render", MessageRender.class); messageRender.render(); } public static void annotationMethod() { AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(HelloWorldConfiguration.class); MessageRender messageRender = ctx.getBean("render", MessageRender.class); messageRender.render(); } } ================================================= setter注入:<property> 构造器注入:<constructor-args> 使用字段注入: ================================================= @Service("singer") public class Singer { @Autowired private Inspiration inspirationBean; public void sing() { System.out.println(inspirationBean); System.out.println("hahaha."+inspirationBean.getLyric()); } } ================================================ @Component("inspirationBean") public class Inspiration { private String lyric="oooooooo"; //@Autowired public Inspiration( String lyric1) { System.out.println("init"); this.lyric = lyric1; } public String getLyric() { return this.lyric; } //@Autowired public void setLyric(String lyric) { this.lyric = lyric; } } ================================================= public class FieldInjection { public static void main(String[] args) { defaultMethod(); } private static void defaultMethod() { // TODO Auto-generated method stub GenericXmlApplicationContext ctx = new GenericXmlApplicationContext(); ctx.load("classpath:/app-contextxml1.xml"); ctx.refresh(); Singer singer = ctx.getBean("singer", Singer.class); singer.sing(); } } ================================================= <context:component-scan base-package="com.kizzle.spring5.ch03a.lyric"></context:component-scan> <bean id="lyric2" class="java.lang.String" c:_0="ggggg2"></bean> <bean id="lyric1" class="java.lang.String" c:_0="ggggg1"></bean> 注入集合: ================================================= <bean id="lyricHolder" class="com.kizzle.spring5.ch03a.collection.LyricHolder"></bean> <bean id="collectionInjection" class="com.kizzle.spring5.ch03a.collection.CollectionInjection"> <property name="list"> <list> <value>Use of the OCI driver should simply involve a changing thin to oci in the URL string.</value> <ref bean="lyricHolder"></ref> </list> </property> <property name="set"> <set> <value>Here are some common problems encountered with a web application which uses a database and tips for how to solve them.</value> <ref bean="lyricHolder"/> </set> </property> <property name="map"> <map> <entry key="firstName" value="zhangsan" /> <entry key="secondRef"> <ref bean="lyricHolder"/> </entry> </map> </property> <property name="props"> <props> <prop key="keyOne">lalala</prop> <prop key="keyTwo">hahaha</prop> </props> </property> </bean> ================================================= 注解版本: ================================================= <context:component-scan base-package="com.kizzle.spring5.ch03a.collection2"></context:component-scan> <util:list id="list" list-class="java.util.ArrayList"> <value>Use of the OCI driver should simply involve a changing thin to oci in the URL string.</value> <ref bean="lyricHolder"/> </util:list> <util:set id="set" set-class="java.util.HashSet"> <set> <value>Here are some common problems encountered with a web application which uses a database and tips for how to solve them.</value> <ref bean="lyricHolder"/> </set> </util:set> <util:map id="map" map-class="java.util.HashMap"> <entry key="firstName" value="zhangsan" /> <entry key="secondRef"> <ref bean="lyricHolder"/> </entry> </util:map> <util:properties id="props"> <prop key="keyOne">lalala</prop> <prop key="keyTwo">hahaha</prop> </util:properties> ================================================= @Resource(name="list") private List<?> list; @Resource(name="map") private Map<String, Object> map; @Resource(name="set") private Set<?> set; @Resource(name="props") private Properties props; ================================================= 获取单例bean和非单例bean StopWatch的用法 ================================================= StopWatch stopWatch = new StopWatch(); stopWatch.start("lookupdemo"); for (int i = 0; i < 100000; i++) { Singer singer = bean.getSinger(); singer.sing(); } stopWatch.stop(); System.out.println(stopWatch.getTotalTimeMillis()); ================================================= 1.定义在类上面: @Component("beanName"):非业务类注入容器并命名;如果不指定beanName,默认使用类名(第一个大写字母变小写)。 @Server("beanName"):主业务类注入容器并命名 @Scope("prototype"):指定bean的作用域:Singleton,prototype @ComponentScan(basePackage={"com.kizzle.package"}):不使用xml,完全使用注解。 使用AnnotationConfigApplicationContext类 @DependsOn("guitar"):放在类上,指定依赖的bean @Lazy:调用时才会实例化bean @Primary:自动装配时,如果类型相同,则指定优先加载的类。 2.定义在方法上面: @Resource(name="bean"):给setter注入对象 @Value("strings"):给setter注入Sting类型 @Lookup("beanName"):给getter返回指定对象,所以该方法可以为抽象方法,该类可以为抽象类。 不管代码中返回什么,返回值都是Lookup指定的对象。 @Bean(name="beanName"):给getter返回对象命名,并注入到容器中。 @Autowired:默认自动装配方式byType ctx.getBeansOfType(JavaBean.class):获取所有的类型 解析依赖项:ApplicationContextAware ================================================= public class Singer implements ApplicationContextAware { private ApplicationContext ctx; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.ctx = applicationContext; } private Guitar guitar; public Singer() { } public void sing() { Guitar bean = this.ctx.getBean("guitar", Guitar.class); bean.sing(); } } ================================================= <bean id="singer" class="com.kizzle.spring5.ch03a.aware.Singer" depends-on="guitar"></bean> <bean id="guitar" class="com.kizzle.spring5.ch03a.aware.Guitar"></bean> ================================================= 以上是xml配置,下面是注解方式: ================================================= @DependsOn("guitar"):放在类上,指定依赖的bean ================================================= @ComponentScan("com.kizzle.spring5.ch03a.aware") AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(DependsOnDemo.class); Singer bean = ctx.getBean("singer", Singer.class); bean.sing(); 自动装配bean:五种模式 1.byName模式 2.byType模式 3.constructor构造函数模式 4.默认模式 5.无 ================================================= <bean id="fooOne" class="com.kizzle.spring5.ch03a.auto.Foo" ></bean> <bean id="barOne" class="com.kizzle.spring5.ch03a.auto.Bar" ></bean> <bean id="targetByName" autowire="byName" class="com.kizzle.spring5.ch03a.auto.Target1" lazy-init="true"></bean> <bean id="targetByType" autowire="byType" class="com.kizzle.spring5.ch03a.auto.Target1" lazy-init="true"></bean> <bean id="targetConstructor" autowire="constructor" class="com.kizzle.spring5.ch03a.auto.Target1" lazy-init="true"></bean> ================================================= 设置Bean的继承 <bean id="parent" class="com.kizzle.spring5.ch03a.inheritanc.Singer" p:name="zhangsan" p:age="25"></bean> <bean id="child" class="com.kizzle.spring5.ch03a.inheritanc.Singer" parent="parent" p:age="8"></bean>
------------恢复内容结束------------
原文:https://www.cnblogs.com/zhangkaipc/p/11800412.html