------------恢复内容开始------------
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