Spring

Spring

官网 : Spring | Home

官方下载地址 : JFrog

GitHub : Spring · GitHub

优点

1、Spring是一个开源免费的框架 , 容器  .

2、Spring是一个轻量级的框架 , 非侵入式的 .

3、控制反转 IoC  , 面向切面 Aop

4、对事物的支持 , 对框架的支持

一句话概括:

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。

IOC本质

控制反转IOC,是一种设计思想,DI(依赖注入)是实现IOC的一种方法

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是IoC容器,其实现方法是依赖注入

IOC是一种编程思想,由主动的编程变成被动的接收

IOC创建对象方式

通过无参构造方法来创建

   <bean id="user" class="com.kuang.pojo.User">
       <property name="name" value="kuangshen"/>
   </bean>

通过有参构造方法来创建 

<!-- 第一种根据index参数下标设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- index指构造方法 , 下标从0开始 -->
   <constructor-arg index="0" value="kuangshen2"/>
</bean>
<!-- 第二种根据参数名字设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <!-- name指参数名 -->
   <constructor-arg name="name" value="kuangshen2"/>
</bean>
<!-- 第三种根据参数类型设置 -->
<bean id="userT" class="com.kuang.pojo.UserT">
   <constructor-arg type="java.lang.String" value="kuangshen2"/>
</bean>

Spring配置

Bean的配置

<!--bean就是java对象,由Spring创建和管理-->

<!--
   id 是bean的标识符,要唯一,如果没有配置id,name就是默认标识符
   如果配置id,又配置了name,那么name是别名
   name可以设置多个别名,可以用逗号,分号,空格隔开
   如果不配置id和name,可以根据applicationContext.getBean(.class)获取对象;

class是bean的全限定名=包名+类名
-->
<bean id="hello" name="hello2 h2,h3;h4" class="com.kuang.pojo.Hello">
   <property name="name" value="Spring"/>
</bean>

import

团队的合作通过import来实现 .

<import resource="{path}/beans.xml"/>

依赖注入(DI)

概念

  • 依赖注入(Dependency Injection,DI)。

  • 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 .

  • 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装配 .

1、构造器注入  (上面)

2、Set 注入 (重点)

要求被注入的属性 , 必须有set方法 , set方法的方法名由set + 属性首字母大写 , 如果属性是boolean类型 , 没有set方法 , 是 is .

属性

public class Student {
    private String name;
    private Address address;
    private String[] books;
    private List<String> hobbys;
    private Map<String, String> card;
    private Set<String> games;
    private String wife;  //此时表示  空值
    private Properties info;

bean.xml

    <bean id="Student" class="com.gh.pojo.Student">
        <!--普通值-->
        <property name="name" value="刘备"/>

        <!--Bean注入 注意点:这里的值是一个引用,ref-->
        <property name="address" ref="Address"/>

        <!--Array-->
        <property name="books">
            <array>
                <value>红楼梦</value>
                <value>西游记</value>
                <value>水浒传</value>
                <value>三国演义</value>
            </array>
        </property>

        <!--List-->
        <property name="hobbys">
            <list>
                <value>听歌</value>
                <value>吃饭</value>
                <value>看电影</value>
                <value>打游戏</value>
            </list>
        </property>

        <!--Map-->
        <property name="card">
            <map>
                <entry key="银行卡" value="20191514110"/>
                <entry key="身份证" value="411723"/>
            </map>
        </property>

        <!--Set-->
        <property name="games">
            <set>
                <value>王者荣耀</value>
                <value>英雄联盟</value>
                <value>皇室战争</value>
                <value>部落冲突</value>
            </set>
        </property>

        <!--注意: null 和 空值 是有区别的

                   空值
        <bean class="ExampleBean">
              <property name="email" value=""/>
        </bean>
        -->

        <!--空值-->
        <property name="wife">
            <null/>
        </property>

        <property name="info">
            <props>
                <prop key="driver">Mysql</prop>
                <prop key="url">com.jdbc</prop>
                <prop key="root">root</prop>
                <prop key="password">123456</prop>
            </props>
        </property>
    </bean>

测试 

    @Test
    public void test1(){
        ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        Student student = context.getBean("Student", Student.class);

        System.out.println(student.toString());
    }

3、p命名和c命名注入

User.java :【注意:这里没有有参构造器!】

public class User {
    private String name;
    private int age;

p 命名空间注入 : 需要在头文件中加入约束文件   属性  set 方法

 导入约束 : xmlns:p="http://www.springframework.org/schema/p"
 
 <!--P(属性: properties)命名空间 , 属性依然要设置set方法-->
 <bean id="user" class="com.kuang.pojo.User" p:name="狂神" p:age="18"/>

c 命名空间注入 : 需要在头文件中加入约束文件    构造器   有参构造!

 导入约束 : xmlns:c="http://www.springframework.org/schema/c"
 <!--C(构造: Constructor)命名空间 , 属性依然要设置set方法-->
 <bean id="user" class="com.kuang.pojo.User" c:name="狂神" c:age="18"/>

Bean的作用域

Singleton  (默认)

Prototype   

        原型模式也就是在之后的getBean时重新new一个对象

    <!--scope作用域:默认单例模式(singleton),原型模式(prototype)-->

    <!--p命名空间注入,可以直接注入属性的值, property-->
    <bean id="User1" class="com.gh.pojo.User" p:age="12" p:name="张三"/>

    <!--c命名空间注入,可以通过有参构造器注入-->
    <bean id="User2" class="com.gh.pojo.User" c:age="13" c:name="李四" scope="prototype"/>

 测试

    @Test
    public void test2(){
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");

        User user1 = context.getBean("User1", User.class);
        User user2 = context.getBean("User1", User.class);
        System.out.println(user1.equals(user2));  //true
        System.out.println(user1.toString());
    }

    @Test
    public void test3(){
        ApplicationContext context = new ClassPathXmlApplicationContext("ApplicationContext.xml");

        User user1 = context.getBean("User2", User.class);
        User user2 = context.getBean("User2", User.class);
        System.out.println(user1.equals(user2));  //false

        System.out.println(user2.toString());
    }

OK,到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的lOC,一句话搞定:对象由Spring来创建,管理,装配!

上一篇:【Android】VeryEasy的开机自启动


下一篇:spring-HelloSpring