import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class Singer {
private static final String DEFAULT_NAME = "Eric Clapton";
private String name;
private int age = Integer.MIN_VALUE;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void init() {
System.out.println("Initializing bean");
if (name == null) {
System.out.println("Using default name");
name = DEFAULT_NAME;
}
if (age == Integer.MIN_VALUE) {
throw new IllegalArgumentException(
"You must set the age property of any beans of type " + Singer.class);
}
}
public String toString() {
return "\tName: " + name + "\n\tAge: " + age;
}
public static void main(String... args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext();
ctx.load("classpath:spring/app-context-xml.xml");
ctx.refresh();
getBean("singerOne", ctx);
getBean("singerTwo", ctx);
getBean("singerThree", ctx);
ctx.close();
}
public static Singer getBean(String beanName,
ApplicationContext ctx) {
try {
Singer bean = (Singer) ctx.getBean(beanName);
System.out.println(bean);
return bean;
} catch (BeanCreationException ex) {
System.out.println("An error occured in bean configuration: "
+ ex.getMessage());
return null;
}
}
}
<beans xmlns="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"
default-lazy-init="true">
<bean id="singerOne"
class="com.apress.prospring5.ch4.Singer"
init-method="init" p:name="John Mayer" p:age="39"/>
<bean id="singerTwo"
class="com.apress.prospring5.ch4.Singer"
init-method="init" p:age="72"/>
<bean id="singerThree"
class="com.apress.prospring5.ch4.Singer"
init-method="init" p:name="John Butler"/>
</beans>
配置Bean的初始化方法
<beans
default-lazy-init="true" default-init-method="init">
<bean id="singerOne"
class="com.apress.prospring5.ch4.Singer"
p:name="John Mayer" p:age="39"/>
<bean id="singerTwo"
class="com.apress.prospring5.ch4.Singer"
p:age="72"/>
<bean id="singerThree"
class="com.apress.prospring5.ch4.Singer"
p:name="John Butler"/>
</beans>
将初始化方法的配置,提到Beans
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class SingerWithInterface implements InitializingBean {
private static final String DEFAULT_NAME = "Eric Clapton";
private String name;
private int age = Integer.MIN_VALUE;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void afterPropertiesSet() throws Exception {
System.out.println("Initializing bean");
if (name == null) {
System.out.println("Using default name");
name = DEFAULT_NAME;
}
if (age == Integer.MIN_VALUE) {
throw new IllegalArgumentException(
"You must set the age property of any beans of type "
+ SingerWithInterface.class);
}
}
public String toString() {
return "\tName: " + name + "\n\tAge: " + age;
}
public static void main(String... args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext();
ctx.load("classpath:spring/app-context-xml.xml");
ctx.refresh();
getBean("singerOne", ctx);
getBean("singerTwo", ctx);
getBean("singerThree", ctx);
ctx.close();
}
private static SingerWithInterface getBean(String beanName,
ApplicationContext ctx) {
try {
SingerWithInterface bean =
(SingerWithInterface) ctx.getBean(beanName);
System.out.println(bean);
return bean;
} catch (BeanCreationException ex) {
System.out.println("An error occured in bean configuration: "
+ ex.getMessage());
return null;
}
}
}
<beans default-lazy-init="true">
<bean id="singerOne"
class="com.apress.prospring5.ch4.SingerWithInterface"
p:name="John Mayer" p:age="39"/>
<bean id="singerTwo"
class="com.apress.prospring5.ch4.SingerWithInterface"
p:age="72"/>
<bean id="singerThree"
class="com.apress.prospring5.ch4.SingerWithInterface"
p:name="John Butler"/>
</beans>
用InitializatingBean 接口来配置初始化方法。需要配置default-lazy-init="true"
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.BeanCreationException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.GenericXmlApplicationContext;
public class SingerWithJSR250 {
private static final String DEFAULT_NAME = "Eric Clapton";
private String name;
private int age = Integer.MIN_VALUE;
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
@PostConstruct
public void init() throws Exception {
System.out.println("Initializing bean");
if (name == null) {
System.out.println("Using default name");
name = DEFAULT_NAME;
}
if (age == Integer.MIN_VALUE) {
throw new IllegalArgumentException(
"You must set the age property of any beans of type " +
SingerWithJSR250.class);
}
}
public String toString() {
return "\tName: " + name + "\n\tAge: " + age;
}
public static void main(String... args) {
GenericXmlApplicationContext ctx =
new GenericXmlApplicationContext();
ctx.load("classpath:spring/app-context-annotation.xml");
ctx.refresh();
getBean("singerOne", ctx);
getBean("singerTwo", ctx);
getBean("singerThree", ctx);
ctx.close();
}
public static SingerWithJSR250 getBean(String beanName,
ApplicationContext ctx) {
try {
SingerWithJSR250 bean =
(SingerWithJSR250) ctx.getBean(beanName);
System.out.println(bean);
return bean;
} catch (BeanCreationException ex) {
System.out.println("An error occured in bean configuration: "
+ ex.getMessage());
return null;
}
}
}
用注解配置初始化方法
import com.apress.prospring5.ch4.Singer;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Lazy;
import org.springframework.context.support.GenericApplicationContext;
import static com.apress.prospring5.ch4.Singer.getBean;
public class SingerConfigDemo {
@Configuration
static class SingerConfig{
@Lazy
@Bean(initMethod = "init")
Singer singerOne() {
Singer singerOne = new Singer();
singerOne.setName("John Mayer");
singerOne.setAge(39);
return singerOne;
}
@Lazy
@Bean(initMethod = "init")
Singer singerTwo() {
Singer singerTwo = new Singer();
singerTwo.setAge(72);
return singerTwo;
}
@Lazy
@Bean(initMethod = "init")
Singer singerThree() {
Singer singerThree = new Singer();
singerThree.setName("John Butler");
return singerThree;
}
}
public static void main(String args) {
GenericApplicationContext ctx =
new AnnotationConfigApplicationContext(SingerConfig.class);
getBean("singerOne", ctx);
getBean("singerTwo", ctx);
getBean("singerThree", ctx);
ctx.close();
}
}
在Bean注解里指定初始化方法