Spring框架初级

目录

什么是Spring

POJO

几个概念

控制反转IOC:

依赖注入DI:

面向切面编程:

初步应用

注解配置

常用注解

例1

例2

XML配置


什么是Spring

Spring是一个轻量级控制反转(IoC)和面向切面(AOP)的容器框架。是面向接口编程,松耦合容易分离。

为减轻编程的工作量而设计。

POJO

全称是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。

依赖注入DI:

上面说到控制反转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作为配置类,下面用经典的几把步枪举个例子

例1

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这个对象,只有这一个,后面可以方便的面向切面编程,还可以设置对象的生命周期。

例2

步枪要加配件,加个瞄准器。

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;
    }

XML配置

实例一个莫辛纳干对象,实例一个红点瞄准器并装配。





    
        
    

    
        
    

测试一下

ApplicationContext app1=new ClassPathXmlApplicationContext("applicationContext.xml");
Gun g2=app1.getBean(M91.class);
g2.getSight().say();
g2.name();

输出 装着红点瞄准器的莫辛纳干M91

如果用到了自动装配注解,bean标签里可以省略装配配置

你可能感兴趣的:(Spring)