目录
什么是Spring
POJO
几个概念
控制反转IOC:
依赖注入DI:
面向切面编程:
初步应用
注解配置
常用注解
例1
例2
XML配置
Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。是面向接口编程,松耦合容易分离。
为减轻编程的工作量而设计。
全称是Plain Ordinary Java Object / Pure Old Java Object,强调它是一个普通java对象,而不是一个特殊的对象,具有一部分getter/setter方法的那种类就可以称作POJO,
JavaBean则比 POJO复杂很多
Java Bean 是可复用的组件,对 Java Bean 并没有严格的规范,理论上讲,任何一个 Java 类都可以是一个 Bean 。
但通常情况下,由于 Java Bean 是被容器所创建(如 Tomcat) 的,所以 Java Bean 应具有一个无参的构造器,另外,
通常 Java Bean 还要实现 Serializable 接口用于实现 Bean 的持久性。
一个系统的运作不是简单的几个类就可以实现的,它往往需要多个类的合作。这就使得每个对象都需要与其合作的对象具有依赖关系,也就是定义类时用到了其他类的对象,
对象是通过自身去创建得到的,而现在所有组件的初始化和调用都是由容器负责。在这整个过程中,实现了控制权的转换,对象获得其他对象引用的方式就成了IOC。
上面说到控制反转IOC,是一个思想概念,依赖注入就是一种具体的实现。
所谓依赖注入,就是由IoC容器在运行期间,动态地将某种依赖关系注入到对象之中。
指扩展功能不修改源代码,将功能代码从业务逻辑代码中分离出来。主要包括日志记录,性能统计,安全控制,事务处理,异常处理等等。这些公共的与业务无关的部分独立编写
首先导入一些所需的包
org.springframework
maven的pom节点
org.springframework
spring-beans
4.2.0.RELEASE
org.springframework
spring-context
4.2.0.RELEASE
org.springframework
spring-core
4.2.0.RELEASE
org.springframework
spring-expression
4.2.0.RELEASE
@Configuration
的注解类表示这个类可以使用 Spring IoC 容器作为 bean 定义的来源。
@Bean
注解告诉 Spring,一个带有 @Bean 的注解方法将返回一个对象,该对象应该被注册为在 Spring 应用程序上下文中的 bean。
@Required
注释应用于 bean 属性的 setter 方法,它表明受影响的 bean 属性在配置时必须放在 XML 配置文件中,否则容器就会抛出一个 BeanInitializationException 异常。
@Autowired
注释,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。
@Qualifier
当创建多个具有相同类型的 bean 时,只装配一个,可以使用 @Qualifier 注释和 @Autowired 注释通过指定一个 bean
建立java类ApplicationContextUtil作为配置类,下面用经典的几把步枪举个例子
Gun接口
public interface Gun {
void name();
}
设置三把枪,毛瑟、莫辛纳干、中正
public class kar98k implements Gun {
@Override
public void name() {
System.out.print("毛瑟98k");
}
}
类创建好了,与以往不同,用Spring管理对象,在ApplicationContextUtil.java中配置
@Bean
public Gun getk(){//不能有子类,是一个普通类
return new kar98k();
}
@Bean
public Gun getm(){
return new M91();
}
@Bean
public Gun getz(){
return new Zhongzheng();
}
对象交给Spring管了,所以我要找他帮我做事,很多事不用我手动。
ApplicationContext app=new AnnotationConfigApplicationContext(ApplicationContextUtil.class);
Gun g1=app.getBean(kar98k.class);
g1.name();
以上就完成了一个最简单的例子,一个单例模式生成的对象,整个项目不用手动new 98k这个对象,只有这一个,后面可以方便的面向切面编程,还可以设置对象的生命周期。
步枪要加配件,加个瞄准器。
public interface Sight {
void say();
String getS();
void setS(String s);
int geti();
void setI(int i);
}
get set略,瞄准器分两种
public class ReflexSight implements Sight {
private String s="反射式瞄准镜";
public void say(){
System.out.print("装着"+s+"的");
}
}
public class TelescopicSight implements Sight{
private int i=1;
public void say(){
if(i==1){
System.out.print("装着望远镜瞄准器的");
}else{
System.out.print("装着"+i+"倍镜的");
}
}
}
加两段实例化代码
@Bean
public Sight getTs(){
return new TelescopicSight();
}
@Bean
public Sight getRs(){
return new ReflexSight();
}
改一下Gun接口和kar98k类,用到两个注解@Autowired和@Qualifier,告诉Spring,自动set一个实例,这个实例去找getTs(配置类里那个@Bean标记的方法名),如果只有一个Sight类型的对象,则不用写@Qualifier,这样就完成了依赖类的自动注入
public class kar98k implements Gun {
private Sight sight;
@Autowired
@Qualifier("getTs")
public void setSight(Sight sight) {
this.sight = sight;
}
@Override
public void name() {
System.out.print("毛瑟98k");
}
@Override
public Sight getSight() {
return sight;
}
}
ApplicationContext app=new AnnotationConfigApplicationContext(ApplicationContextUtil.class);
Gun g1=app.getBean(kar98k.class);
g1.getSight().say();
g1.name();
最终运行输出 装着望远镜瞄准器的毛瑟98k
想安安静静地做一个狙击手,我可以在配置类中切换成8倍镜,设置getTs方法生成对象
@Bean
public Sight getTs(){
Sight sight=new TelescopicSight();
sight.setI(8);
return sight;
}
实例一个莫辛纳干对象,实例一个红点瞄准器并装配。
测试一下
ApplicationContext app1=new ClassPathXmlApplicationContext("applicationContext.xml");
Gun g2=app1.getBean(M91.class);
g2.getSight().say();
g2.name();
输出 装着红点瞄准器的莫辛纳干M91
如果用到了自动装配注解,bean标签里可以省略装配配置