Spring5笔记

------------恢复内容开始------------

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>

  

------------恢复内容结束------------

猜你喜欢

转载自www.cnblogs.com/zhangkaipc/p/11800412.html