1 使用Java config来配置POJO
来博客园写的第一篇博客,开始我的Spring学习之旅
Spring框架的核心是控制反转(Ioc),控制反转的个人理解是,以前我们新建一个对象的时候,都是需要的时候new一个,是主动取创建一个java类对象;控制反转的思想是,Sping框架事先new好一些对象,等我们需要的时候,直接去获取就可以了;创建对象的主体从使用者转换到了提供者(Spring),即为控制反转;
接下来,让我们从代码的角度,体验一下控制反转的思想,假设我们要开发一个生成序列号的应用,由于不同的需求,我们需要设置不同类型的序列号,每个序列号都有自己的前缀、后缀与初始值;根据需求,先创建一个SequenceGenerator类,如下所示,
package com.apress.springrecipes.sequence;
import java.util.concurrent.atomic.AtomicInteger;
public class SequenceGenerator {
private String prefix; //前缀
private String suffix; //后缀
private int initial; //初始值
private final AtomicInteger counter = new AtomicInteger(); //每个生成器的数值
public SequenceGenerator(){
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
public void setInitial(int initial) {
this.initial = initial;
}
public String getSequence(){
StringBuilder builder = new StringBuilder();
builder.append(prefix)
.append(initial)
.append(counter.getAndIncrement())
.append(suffix);
return builder.toString();
}
}
类定义好以后,接下来,Spring框架定义该类的实例,可创建一个Java配置类并使用实例值来实现,具体代码如下,
package com.apress.springrecipes.sequence;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration //告诉Spring框架,该类SequenceGeneratorConfiguration为一个配置类
public class SequenceGeneratorConfiguration {
@Bean
public SequenceGenerator sequenceGenerator(){
SequenceGenerator seqgen = new SequenceGenerator();
seqgen.setPrefix("30");
seqgen.setSuffix("A");
seqgen.setInitial(100000);
return seqgen;
}
}
当Spring遇到带有@Configuration注解的类时,它会寻找类中bean定义的实例,这些定义是由@Bean注解所修饰的Java方法,方法名即为bean的名字;
随后,实例化Spring IoC容器来扫描注解,在扫描的过程中,Spring会自动检测@Configuration与@Bean的注解,这样后面就可以从IoC中获取bean实例了。此处使用application context(应用上下文)来实现IoC容器,由于Application是一个接口,因此需要实例化他的一个实现才行,Spring提供了几种应用上下文的实现,推荐使用AnnotationConfigurationApplicationContext,他是最新也是最灵活的一种实现,可通过该类来加载Java配置文件,具体代码如下,
package com.apress.springrecipes.sequence; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; public class Main { public static void main(String[] args){ ApplicationContext context = new AnnotationConfigApplicationContext(SequenceGeneratorConfiguration.class);// //获取bean的方法1,从应用上下文中获取bean,只需调用getBean()方法,并传递唯一的bean名字即可,由于getBean()返回的是java.lang.Object //因此需要转换为需要的类型 // SequenceGenerator generator = (SequenceGenerator) context.getBean("sequenceGenerator"); //获取bean的方法2 或指定bean的类名 SequenceGenerator generator = context.getBean("sequenceGenerator",SequenceGenerator.class); System.out.println(generator.getSequence()); System.out.println(generator.getSequence()); } }
运行该类,你将会看到如下输出,

因为调用了两次getSequence()方法,结合计数器counter所以生成了两个不同的序列号;
Spring的第一篇博客完成,撒花~~~

浙公网安备 33010602011771号