java框架之Spring——Spring的IOC和Spring IOC的DI依赖注入

Spring简介:

一、MVC(结构):Model(数据层) View(显示层) Controller(控制层)

Spring就是一个轻量级的大杂烩,可以集成管理java中的总多框架

Spring-IOC:Dl(依赖注入) (控制反转) :管属性
AOP (面向切面编程) : 管方法
Spring可以完全代理整个类

二、Spring的优势

1.方便解耦,简化开发:
(1)耦合:程序之间的耦合性就是对象和java类之间联系太过于精密

(2)解耦:就是在创建对象时不使用new关键字(不去导入包名)

(*)但是:程序之间的耦合只有降低,不能完全清除

三、Spring的IOC

IOC:控制反转,将对象的创建过程改为spring框架控制;

创建一个maven项目,删除src,新建一个module,命名为Java-pro

(1)、在子类项目Java-pro中导入pom文件坐标

<dependencies>
        <!-- 测试的-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
</dependencies>
    <build>
            <!--maven插件-->
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                </plugin>
            </plugins>
            <!--加载src目录下的静态文件-->
            <resources>
                <resource>
                    <directory>${basedir}/src/main/java</directory>
                    <includes>
                        <include>**/*.xml</include>
                    </includes>
                </resource>
                <resource>
                    <directory>${basedir}/src/main/resources</directory>
                </resource>
            </resources>
        </build>

(2)、在resources目录下——>右键——>new——>XML Configuration File——>Spring Config
在这里插入图片描述
(3)、使用spring IOC实例化对象

<?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.xsd">


    <!--使用spring IOC实例化对象
    以下过程相当于UserDao userDao = new UserDao();
    id指向要创建的对象名,class指向该对象的类地址
    -->
    <bean id="userDao" class="com.gyy.dao.UserDao"></bean>
    
    <!--创建user对象-->
    <bean id="user" class="com.gyy.dao.User"></bean>

</beans>

(4)、在测试类中进行测试(创建对象的过程)

import com.gyy.dao.User;
import com.gyy.dao.UserDao;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserTest {

    @Test
    public void showUser(){
        //通过springIOC管理bean
        //读取spring-config.xml(有三种方式)
        //当前使用ClassPathXmlApplicationContext:使用它去读取配置文件时就已经创建好了对象
 		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //取出IOC容器的getBean对象
        //getBean里面写xml对应的id
        UserDao userDao = (UserDao)applicationContext.getBean("userDao");
 		User user = (User)applicationContext.getBean("user");
    }
}

注:读取spring-config.xml的三种方式

ClassPathXmlApplicationContext:加载类路径下的配置文件,要求配置文件必须在类路径下(常用)
FileSystemXmlApplicationContext:加载磁盘任意路径下的配置文件(必须有访问权限)
AnnotationConfigAppiicationconitex划读取注解配置容器

第二种方法:FileSystemXmlApplicationContext

import org.springframework.beans.factory.xml.XmlBeanFactory;

Resource resource = new ClassPathResource("spring-config.xml");
        BeanFactory beanFactory = new XmlBeanFactory(resource);
    	UserDao  UserDao = (UserDao)beanFactory.getBean("userDao");

四、Spring IOC的 DI依赖注入(1.构造器注入;2.通过set注入;3.通过注解注入)

(1)、在子类项目中导入pom文件坐标

<dependencies>
        <!-- 测试的-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
        </dependency>
        <!--Spring -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.0.2.RELEASE</version>
        </dependency>
    </dependencies>
    <build>
        <!--maven插件-->
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.3.2</version>
            </plugin>
        </plugins>
        <!--加载src目录下的静态文件-->
        <resources>
            <resource>
                <directory>${basedir}/src/main/java</directory>
                <includes>
                    <include>**/*.xml</include>
                </includes>
            </resource>
            <resource>
                <directory>${basedir}/src/main/resources</directory>
            </resource>
        </resources>
    </build>

(2)、模拟操作——>创建User类

public class User {
    public String userName;
    public String sex;
    public int age;
//该构造方法是为了xml文件中name的使用
    public User(String userName, String sex, int age) {
        this.userName = userName;
        this.sex = sex;
        this.age = age;
    }
}

(3)、通过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.xsd">

    <bean id="user" class="com.gyy.pojo.User">
        <!--使用构造方法为属性赋值 name指向有参构造方法 value:要赋的值-->
        <constructor-arg name="userName" value="小宝贝"></constructor-arg>
        <constructor-arg name="age" value="18"></constructor-arg>
        <constructor-arg name="sex" value="仙女"></constructor-arg>
    </bean>
    
</beans>

(4)、测试是否成功

import com.gyy.pojo.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    @org.junit.Test
    public void Tset(){
        //读取配置文件信息
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //从IOC容器中读取出来
        User user = (User) applicationContext.getBean("user");
        System.out.println(user.userName+user.age+user.sex);
    }
}

测试结果:

小宝贝18仙女

Process finished with exit code 0

第二种:通过set函数给属性赋值

(1)、模拟操作——>创建UserSet类

public class UserSet {

    private String userName;
    private String sex;
    private int age;

    public String getUserName() {
        return userName;
    }

    public String getSex() {
        return sex;
    }

    public int getAge() {
        return age;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

(2)、在xml文件中通过set函数赋值

<!--第二种:通过set函数赋值-->
    <bean id="userset" class="com.gyy.pojo.UserSet">
        <property name="userName" value="小仙女"></property>
        <property name="sex" value="大美女"></property>
        <property name="age" value="18"></property>
    </bean>

(3)、测试是否成功

import com.gyy.pojo.UserSet;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

    @org.junit.Test
    public void Tset(){
        //读取配置文件信息
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //从IOC容器中读取出来
        UserSet userSet = (UserSet) applicationContext.getBean("userset");
        System.out.println(userSet.getUserName()+userSet.getSex()+userSet.getAge());
    }
}

测试结果

小仙女大美女18

Process finished with exit code 0

*、特别说明1

(1)、新建user1类

import java.util.Date;

public class User1 {
    private Date date;

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }
}

(2)、通过xml文件引用data

<!--我们去赋值只能付基本数据类型和string,而我们的对象需要去引用
        对象之间的耦合
       -->
<!--第一步:实例化对象-->
    <bean id="dateTime" class="java.util.Date"></bean>
<!--第二步:引用对象,只能通过ref指向-->
    <bean id="user1" class="com.gyy.pojo.User1">
        <!-- 这里为对象属性赋值只能通过ref指向-->
        <property name="date" ref="dateTime"></property>
    </bean>

*、特别说明1

(1)、新建Array类

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

public class Array {
    private List<String> list;
    private Set<String> set;
    private Map<String,String> map;

    public void setList(List<String> list) {
        this.list = list;
    }

    public void setSet(Set<String> set) {
        this.set = set;
    }

    public void setMap(Map<String, String> map) {
        this.map = map;
    }

    public List<String> getList() {
        return list;
    }

    public Set<String> getSet() {
        return set;
    }

    public Map<String, String> getMap() {
        return map;
    }
}

(2)、通过xml文件给集合赋值

<!--使用IOC实例化集合-->
    <bean id="array" class="com.gyy.pojo.Array">
        <!--注入list-->
        <property name="list">
            <list>
                <value>视频呀</value>
                <value>想宝宝</value>
                <value>代码呀</value>
            </list>
        </property>

        <property name="map">
            <map>
                <entry key="aa" value="AA"></entry>
                <entry key="bb" value="BB"></entry>
                <entry key="cc" value="CC"></entry>
            </map>
        </property>

        <property name="set">
            <set>
                <value>想你哦</value>
                <value>在每个日夜</value>
            </set>
        </property>
    </bean>

(3)、测试

import com.gyy.pojo.Array;

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

import java.util.Map;
import java.util.Set;

public class Test {

    @org.junit.Test
    public void Tset(){
        //读取配置文件信息
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring-config.xml");
        //从IOC容器中读取出来
        Array array = (Array)applicationContext.getBean("array");
        //遍历
        for (String list:array.getList()){
            System.out.println(list);
        }
        Map<String, String> map = array.getMap();
        System.out.println(map.get("aa"));
        System.out.println("*******************");
        Set<String> set = array.getSet();
        for (String s:set
             ) {
            System.out.println(set);
        }


    }
}

测试结果

视频呀
想宝宝
代码呀
AA
*******************
[想你哦, 在每个日夜]
[想你哦, 在每个日夜]

Process finished with exit code 0

结语:技术无他,唯有熟尔,知其然,也知其所以然!
在这里插入图片描述
文章连载中…

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值