Spring

Spring 框架:
    前无古人,后无来者。它可以包容其他的一切框架。
    a. 什么是Spring框架:
        它是用于简化J2EE业务层开发的轻量级技术框架,他的核心是IOC和AOP
        AOP:编程思想:面向对象: OOP
                           过程
                           服务:   分布式架构:SOA
                           切面的编程: AOP
    b. 编码体验Spring 的强大之处:
        作用:可以把普通的JavaBean魔术般的变为ejb
        对象实例化的不同之处
        
    c. 引入Spring框架
        Spring.jar : spring1.0-Spring5.0 (屹立不倒,而且越来越牛)
    d. 使用的Spring框架(容器)来构建对象:
        观察:实例化武器Weapon   实例化骑士Knight
        利用Spring框架来实例化这两个对象
        配置 xml/annocation:以前Spring框架都是利用XML来配置
        ,但是现在来看还是标注。并存的,看的懂,其实用xml配置更加灵活
        ,清晰,但是他比较繁琐,而标注比较简单
        beans.xml — src/main/resources
    e. 在配置文件中配置你需要实例化的JavaBean
            Weapon      Knight
    f. 调用代码实例化Bean    
    
 原理: 工厂设计模式  反射机制
    a.构建BeanFactory
    ApplicationContext:其实就是那个工厂,他是创建Bean的工厂类
    所以Spring框架利用了工厂设计模式,先构造出工厂类,然后工厂来实例化
    他所管理的Bean。
    b. 你要告诉这个工厂我要实例化哪些Bean传一个字符串来告诉工厂实例化的类
        Spring把要实例化的Bean写到了配置文件中,
        然后利用XML的解析技术拿到要实例化累的相关信息,然后实例化相应的Bean
    c. 类只要能参数化了,那么就可以把他写道配置文件,
        然后就可以利用反射技术进行实例化Class.forName(“类名”)
结论:Spring是个大容器(工厂) 他去实例化你想要的Bean,也就是说你把Bean的生命周期纳入到Spring容器中去管理,
        不是我们直接构造出来的,这种技术就交Spring的IOC技术。
        IOC技术: 控制反转,也叫(依赖注入),他们说的一回事。
        控制反转:Bean的生命周期不受你控制,而是交给Spring容器管理。
优势: 1. 解耦,完全可以面向接口编程
            在代码中完全不用体现具体的实现类
        2. 类配置在配置文件中,方便修改维护
        Spring容器对Bean的管理,默认是单例的。
        Spring框架用到那些设计模式:工厂模式  单例模式 代理设计模式
    Spring框架如何利用IOC
        (1). 实现了控制反转,Spring容器能帮我们实例化对象,但是并没有做到DI(依赖注入)//为我们提供依赖注入。
    
配置Spring
    xml来配置Bean,利用Spring容器来例化Bean(IOC)
    Spring(4.0),Spring支持用标注的形式来配置
    如何利用标注来实现Spring框架的IOC?
    (1). 利用@Componet标注来注解你要纳入到Spring容器管理的类
    (2). 写个配置类,要告诉Spring从哪些地方来找这些Bean
    
    1. @Component 标注注解组件
    2. @Configuration
       @ComponentScan(“day”)    注明组件的位置,配置类相当于bean.xml配置文件
       @Autowired   如果Spring容器检测到Weapon类的实例,就会自动注入进来
       @Qualifier(“axe”)//– 明确指定这个Bean
    3. Spring容器获取Bean

 

 

使用XML构建Spring

 

1.beans.xml

 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <beans xmlns="http://www.springframework.org/schema/beans"
 3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4     xsi:schemaLocation="http://www.springframework.org/schema/beans
 5         http://www.springframework.org/schema/beans/spring-beans.xsd">
 6     <!-- 武器Bean类 -->
 7    <bean id="weapon" class="day01.Axe"></bean>
 8     骑士Bean类
 9     <bean id="knight" class="day01.Knight">
10         骑士Bean的武器属性
11             name="weapon" 的值一定要和Knight类的属性值一样
12             ref="weapon" 的值一定要和你配置的武器类Bean 的ID 一样
13         
14         <property name="weapon" ref="weapon"></property>
15     </bean> 
21     
22 </beans>

 2.Weapon.java

import org.springframework.stereotype.Component;

/**
 * 武器类(接口)
 * @author 
 *
 */
public interface Weapon {
    void fire();
}
//-- 斧头

class Axe implements Weapon{

    @Override
    public void fire() {
        System.out.println("砍两下.....");
    }
    
}

class Gun implements Weapon{
    @Override
    public void fire() {
        System.out.println("枪.....");
    }
}

 

3.Knight.java

 1 import org.springframework.beans.factory.annotation.Autowired;
 2 import org.springframework.beans.factory.annotation.Qualifier;
 3 import org.springframework.stereotype.Component;
 4 
 5 /**
 6  * 骑士类
 7  * @author 儿子
 8  *
 9  */
10 
11 public class Knight {
12 
13     private Weapon weapon;
14     
15     public Knight() {}
16     public Knight(Weapon weapon) {
17         this.weapon = weapon;
18     }
19     
20     public void setWeapon(Weapon weapon) {
21         this.weapon = weapon;
22     }
23     
24     public void attack() {
25         weapon.fire();
26     }
27     
28     
29 }

 

4.invoker.java

 1 import org.springframework.context.ApplicationContext;
 2 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 3 
 4 /**
 5  * 调用者
 6  * 
 7  */
 8 public class Invoker {
 9     public static void main(String[] args) {
10         /* 以下的代码是我们传统的构造Bean的方式
11         //-- 1. 武器
12         Weapon weapon = new Axe();
13         //-- 2. 骑士
14         Knight knight = new Knight(weapon);
15         //-- 3. 骑士发起攻击
16         knight.attack();
17         //-- 4. 换武器:
18            knight.setWeapon(new Gun());
19         knight.attack();
20         */
21         
22         //-- 利用Spring框架来构建Bean对象
23         //-- 1. 构造Spring容器对象(利用xml文件的配置)
24         ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
25     //-- 2. 通过Spring容器来获取想要的Bean
26     Knight knight = (Knight)ctx.getBean("knight");
27     //-- 3. 骑士发起攻击
28     knight.attack();    
29     
30     }
31 }
32             

 

使用注解构建Spring

 1.Weapon.java

import org.springframework.stereotype.Component;

/**
 * 武器类(接口)
 * @author 
 *
 */
public interface Weapon {
    void fire();
}
//-- 斧头
@Component("axe")
class Axe implements Weapon{

    @Override
    public void fire() {
        System.out.println("砍两下.....");
    }
    
}
@Component("gun")
class Gun implements Weapon{
    @Override
    public void fire() {
        System.out.println("枪.....");
    }
}

 

 2.Knight.java

 1 import org.springframework.beans.factory.annotation.Autowired;
 2 import org.springframework.beans.factory.annotation.Qualifier;
 3 import org.springframework.stereotype.Component;
 4 
 5 /**
 6  * 骑士类
 7  * @author 儿子
 8  *
 9  */
10 @Component("knight")
11 public class Knight {
12     @Autowired //- 如果Spring容器检测到Weapon类的实例,就会自动注入进来
13     @Qualifier("axe")//-- 明确指定这个Bean
14     private Weapon weapon;
15     
16     public Knight() {}
17     public Knight(Weapon weapon) {
18         this.weapon = weapon;
19     }
20     
21     public void setWeapon(Weapon weapon) {
22         this.weapon = weapon;
23     }
24     
25     public void attack() {
26         weapon.fire();
27     }
28     
29     
30 }

 

 3.Weapon.java

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * Spring 容器的配置类,来代替那个Bean.xml文件
 * 1. 类上面使用@Component来注解
 * 2. 在配置类中使用@Bean 标注来注解你要实例化的类
 * @author 
 *
 */
@Configuration
@ComponentScan("day01")    //-- 告诉Spring从哪个包下寻找Component或者Bean
public class BaseConfiguration {
    /*@Bean("a")
    public String A(){        //- 类似于@Component标注
        return "a";
    }
    
    @Bean("foo")
    public Foo foo() {
        return new Foo();
    }*/
}
    

 

 4.Invoker.java

 1 import org.springframework.context.ApplicationContext;
 2 import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 3 
 4 /**
 5  * 调用者
 6  * 
 7  */
 8 public class Invoker {
 9     public static void main(String[] args) {
10         /* 以下的代码是我们传统的构造Bean的方式
11         //-- 1. 武器
12         Weapon weapon = new Axe();
13         //-- 2. 骑士
14         Knight knight = new Knight(weapon);
15         //-- 3. 骑士发起攻击
16         knight.attack();
17         //-- 4. 换武器:
18         knight.setWeapon(new Gun());
19         knight.attack();
20         */
21         
22     
23         //-- 1.构造Spring容器
24         ApplicationContext ctx = 
25                 new AnnotationConfigApplicationContext(BaseConfiguration.class);
26         //-- 2. 获取Bean
27         
28         Knight knight = (Knight)ctx.getBean("knight");
29 //        System.out.println(ctx.toString());
30         knight.attack();
31         
32 //        Axe axe = (Axe)ctx.getBean("axe");
33 //        System.out.println(axe);
34 //        axe.fire();
35     }
36 }

 

    原文作者:张泽
    原文地址: https://www.cnblogs.com/zhangze-lifetime/p/11762147.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞