Spring基本概念,环境搭建,IoC注入方式详细演示

  • Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目得是简化企业开发,提高开发效率
  • Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式
    这里写图片描述
  • IoC(Inversion of Control,控制反转)。这是spring的核心,贯穿始终。所谓IoC,对于spring框架来说,应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的。这样控制权就由应用转移到了外部容器,控制权的转移就是所谓反转
  • DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。
  • 注入方式:构造器注入和属性注入,详细见代码演示部分
  • Spring环境搭建:首先下载spring-framework-3.2.6.RELEASE-dist.zip,按需导入jar包(初学阶段最好不要一次全导入,而是根据异常提示,逐步导入),演示注入方式,只需导入如下基本包(如下图),其中commons-loggin-1.2.jar是Apache官网提供的。
    这里写图片描述
  • Beans.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<import resource="Beans2.xml"/><!-- 外部引用引入 -->

<!-- spring环境的全局配置文件Beans.xml -->
<!-- 定义一个实体对象,单例的 -->
<!-- bean默认是单例的singleton -->
<bean id="userid1" class="com.entity.User" name="username1" scope="singleton"></bean>
<!-- 配置scope为prototype会变成多例的 -->
<bean id="userid2" class="com.entity.User" name="username2" scope="prototype"></bean>

<!-- 构造器注入 -->
<bean id="user1" class="com.entity.User">
    <!-- 写法1:一个参数的构造器 -->
    <!-- 虽然你这里是通过有参的构造注入的,但依然要写一个无参的默认构造器,否则会报错。这只能 -->
    <constructor-arg name="num" value="XH1003060101"></constructor-arg>
</bean>
<bean id="user2" class="com.entity.User">
    <!-- 写法2:多个参数的构造器 -->
    <constructor-arg>
        <value>1001</value>
    </constructor-arg>
    <constructor-arg>
        <value>张三</value>
    </constructor-arg>
    <constructor-arg>
        <value>18</value>
    </constructor-arg>
    <constructor-arg>
        <value>XH1003060117</value>
    </constructor-arg>
</bean>
<bean id="user2_2" class="com.entity.User">
    <!-- 写法3:多个参数的构造器 -->
    <constructor-arg index="0" value="1001"></constructor-arg>
    <constructor-arg index="1" value="张三"></constructor-arg>
    <constructor-arg index="2" value="18"></constructor-arg>
    <constructor-arg index="3" value="XH1003060117"></constructor-arg>
</bean>


<!-- 属性注入 -->
<bean id="user3" class="com.entity.User">
    <!-- 这是基本型包括字符串的注入 -->
    <property name="id" value="1002"></property>
    <property name="name" value="李四"></property>
    <property name="age" value="18"></property>
    <property name="num" value="XH1003060118"></property>
</bean>

<bean id="people1" class="com.entity.People">
    <!-- 引用型注入 -->
    <property name="u" ref="user3"></property>
</bean>

<bean id="people2" class="com.entity.People">
    <constructor-arg>
        <value>王五</value>
    </constructor-arg>
    <!-- 构造器注入时,注入引用型 -->
    <constructor-arg>
        <ref bean="user3"/>
    </constructor-arg>
</bean>
<bean id="people3" class="com.entity.People">
    <!-- 构造器注入时,注入引用型 -->
    <constructor-arg name="u" ref="user3"></constructor-arg>
</bean>

<bean id="people4" class="com.entity.People">
    <!-- 属性注入array-->
    <property name="uArray">
        <array>
            <ref bean="user1"/>
            <ref bean="user2"/>
            <ref bean="user3"/>
        </array>
        <!-- 如果是基本型或普通字符串,这样注入
        <array>
            <value>aa</value>
            <value>bb</value>
        </array> -->        
    </property> 
</bean>

<bean id="people5" class="com.entity.People">
    <!-- 属性注入:list -->
    <property name="uList">
        <list>
            <!-- 两种写法 -->
            <ref bean="user1"/>
            <ref bean="user3"/>
            <bean class="com.entity.User">
                <property name="name" value="李木子"></property>
            </bean>
        </list>
    </property>
</bean>

<bean id="people6" class="com.entity.People">
    <!-- 属性注入:map -->
    <property name="map">
        <map>
            <!-- 三种写法 -->
            <entry key="a" value-ref="user3"></entry>
            <entry key="b">
                <ref bean="user3"/><!-- 这其实就是内部引用引入 -->
            </entry>
            <entry key="c">
                <bean class="com.entity.User">
                    <property name="name" value="何炅"></property>
                </bean>
            </entry>
        </map>
    </property>
</bean>

<bean id="people7" class="com.entity.People">
    <!-- 属性注入:properties -->
    <property name="pro">
        <props>
            <prop key="k1">v1</prop>    
            <prop key="k2">v2</prop>    
            <prop key="k3">v3</prop>    
        </props>
    </property>
</bean>

<bean id="people8" class="com.entity.People">
    <!-- 外部引用引入 -->
    <property name="u" ref="userOut"></property>
</bean>
</beans>
  • Beans2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd">
<bean id="userOut" class="com.entity.User">
    <property name="name" value="外部引入"></property>
</bean>
</beans>
  • Demo1.java
package com.test;

import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.entity.People;
import com.entity.User;

public class Demo1 {

    public static void main(String[] args) {
        ApplicationContext app = new ClassPathXmlApplicationContext("Beans.xml");
        //测试jar包导入是否正确
        //System.out.println(app);

        //默认是单例的,scope="singleton"
        //两种获取bean的方式,id,name
        //通过id获取
        User user1 = (User) app.getBean("userid1");
        //通过name获取
        User user2 = (User) app.getBean("username1");
        System.out.println(user1);//com.entity.User@7f5580
        System.out.println(user2);//com.entity.User@7f5580

        //多例 scope默认是sigleton单例的,设置成 prototype则为多例
        User user3 = (User) app.getBean("userid2");
        User user4 = (User) app.getBean("username2");
        System.out.println(user3);//com.entity.User@106fc94
        System.out.println(user4);//com.entity.User@7f5580

        //bean中的IoC注入方式,往大了分为两种:构造器注入constructor,和属性注入setter
        //属性注入里有基本注入,还有引用注入,引用注入又分为外部引用注入,和内部引用注入

        User u1 = (User) app.getBean("user1");
        System.out.println(u1.getNum());
        User u2 = (User) app.getBean("user2");
        System.out.println(u2.getName());
        System.out.println(u2.getAge());
        User u2_2 = (User) app.getBean("user2_2");
        System.out.println(u2.getName());
        System.out.println(u2.getAge());
        User u3 = (User) app.getBean("user3");
        System.out.println(u3.getName());
        System.out.println(u3.getAge());

        People p1 = (People) app.getBean("people1");
        System.out.println(p1.getU().getName());
        People p2 = (People) app.getBean("people2");
        System.out.println(p2.getU().getName());
        People p3 = (People) app.getBean("people3");
        System.out.println(p3.getU().getName());

        People p4 = (People) app.getBean("people4");
        User[] uArray = p4.getuArray();
        User u0 = uArray[0];
        String num = u0.getNum();
        System.out.println(num);

        People p5 = (People) app.getBean("people5");
        List<User> uList = p5.getuList();
        System.out.println(uList.get(0).getNum());
        System.out.println(uList.get(1).getNum());
        System.out.println(uList.get(2).getName());

        People p6 = (People) app.getBean("people6");
        Map<String,User> map = p6.getMap();
        Set<String> k = map.keySet();
        Iterator<String> it = k.iterator();
        while(it.hasNext()){
            String key = it.next();
            User value = map.get(key);
            System.out.println(key+":"+value.getName());
        }

        People p7 = (People) app.getBean("people7");
        Properties pro = p7.getPro();
        System.out.println(pro.getProperty("k3"));

        People p8 = (People) app.getBean("people8");
        System.out.println(p8.getU().getName());
    }
}
  • 运行结果
    这里写图片描述

猜你喜欢

转载自blog.csdn.net/yicha_i/article/details/82716865