前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【SSM_01】Spring-IOC

【SSM_01】Spring-IOC

作者头像
用户8250147
发布2021-02-04 10:48:49
发布2021-02-04 10:48:49
22800
代码可运行
举报
文章被收录于专栏:黑马黑马
运行总次数:0
代码可运行

一、spring 概述

1. 什么是 spring
代码语言:javascript
代码运行次数:0
运行
复制
* spring 是分层的 java ee 应用,全栈(full-stact)轻量级开源框架,主要有 IOC(反转控制) 、 AOP(面向切面编程) 
* 反转控制:将对象的创建全交给 spring,有利于解耦,降低代码的依赖关系
2. 使用方法
代码语言:javascript
代码运行次数:0
运行
复制
① 导包
    需要导入 4 个jar包 【spring-aop 、spring-beans 、spring-core 、spring-expression】
    导入 spring-context 相当于直接导入四个
② 编写类
③ 创建并配置核心配置文件 applicationContext.xml 【可以任意命名,但约定俗成为 applicationContext.xml】
④ 使用 spring 的 api 获取 Bean

二、spring 的配置

1. applicationContext.xml
代码语言:javascript
代码运行次数:0
运行
复制
<?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="唯一id名" class="关联全类名" >
    </bean>
</beans>
2. Bean的范围
代码语言:javascript
代码运行次数:0
运行
复制
① 属性:scope
② 取值:singleton【单例】
        prototype【多例】
        ------ 了解 ------
        --- 用于web项目---
        request
        session
        global session
③ 注意
    - 单例只在配置文件加载时创建一次,多例只要是调用 getBean 方法就会创建对象
    - 单例可能会造成数据泄露而多例不会,在单例中定义局部变量可以解决数据泄露问题
    - 单例执行效率大于多例
④ 示例
    <bean id="userService" class="com.softwareMan.service.UserService"  scope="prototype"></bean>
3. Bean的生命周期
代码语言:javascript
代码运行次数:0
运行
复制
① 创建
- 属性:init-method
- 取值:关联类中的方法
- 属性:destory-method
- 取值:关联类中的方法
    <bean id="userService" class="com.softwareMan.service.UserService"  init-method="init"></bean>
3. Bean的实例化
代码语言:javascript
代码运行次数:0
运行
复制
① 无参构造方法实例化【☆☆☆☆☆】
* 配置
    <bean id="userService" class="com.softwareMan.service.UserService" ></bean>
* 注意
    必须要有无参构造方法

② 工厂静态方法实例化
* 配置    
    <bean id="userService" class="com.softwareMan.factory.UserServiceFactory"  factory-method="getUserService" ></bean>
* 注意
    - class 属性指向 工厂类
    - 一定要有 factory-method 属性,不然默认寻找空参构造
    - 工厂静态方法实例化中 factory-method 配置的方法为静态方法
    - 可以用来获取不能直接 new 的对象,例如:connection

③ 实例化
* 配置
    <bean id="factory" class="com.softwareMan.factory.UserServiceFactory" ></bean>
    <bean id="userService" factory-bean="factroy" factory-method="getUserService" ></bean>
* 注意
    - 此方法中工厂类中方法不是静态方法,需要使用对象调用,故先要配置工厂类
4. Bean的依赖注入(dependency Injection)
代码语言:javascript
代码运行次数:0
运行
复制
① 什么是DI
    * 依赖注入是反转控制的具体实现,通过反转控制将对象的创建权交给了spring以降低耦合能消除耦合,通过依赖注入让spring来维护

② 注入对象
- set方法一
    * 前置条件
          要有成员变量以及提供set方法
    * 配置
          <bean id="id名1" class="全类名1"></bean>
          <bean id="id名2" class="全类名2">
            <property name="类2中的属性" ref="id名1" ></property>
          </bean>
    * 示例
          <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
          <bean id="userService" class="com.softwareMan.service.UserService">
            <property name="userDao" ref="userDao" ></property>
          </bean>
- set方法二
    * 示例
        xmlns:p="http://www.springframework.org/schema/p"
    【配置】
        <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
        <bean id="userService" class="com.softwareMan.service.UserService" p:userDao-ref="userDao"></bean>
- 构造方法
     * 前置条件
         被注入的方法必须要有成员变量以及有参构造
     * 配置
         <bean id="id名1" class="全类名1"></bean>
         <bean id="id名2" class="全类名2">
             <constructor-arg name="类2中的属性" ref="id名1" ></constructor-arg>
         </bean>
     * 示例
         <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl"></bean>
         <bean id="userService" class="com.softwareMan.service.UserService">
             <constructor-arg name="userDao" ref="userDao" ></constructor-arg>
         </bean>

③ 注入数据【set方式与构造方式类似】
- 普通(基本数据类型/string)
    * 示例
        <constructor-arg name="name" value="123" />
- List
    * 示例
         <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
             <constructor-arg name="list" >
                 <list>
                     <value>123</value>
                     <value>456</value>
                 </list>
             </constructor-arg>
         </bean>
- Map
    * 示例
        <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
            <property name="map" >
                <map>
                    <entry key="aaa" value="111"></entry>
                    <entry key="bbb" value="222"></entry>
                </map>
            <property>
        </bean>    
- properties
    * 示例
        <bean id="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
            <constructor-arg name="pro">
                <props>
                    <prop key="sss">1111</prop>
                    <prop key="ssd">2222</prop>
                </props>
            </constructor-arg>
        </bean>

④ 优缺点
- set
    * 优点
           参数比较灵活,可以不赋值
    * 缺点
           某些参数需要使用,单位赋值
- 构造方法
    * 优点
        强制给数据赋值
    * 缺点
        未用到此数据任要赋值

⑤ 引入其他配置文件【分模块开发】
    * 示例
        <import resource="applicationContext.xml" />

三、spring的api

1. ApplicationContext的继承体系
代码语言:javascript
代码运行次数:0
运行
复制
BeanFactory                //顶层接口,调用getBean时才会创建对象(懒汉)
    -- ApplicationContext        //配置文件加载时就会创建对象(饿汉),适用于单例
        -- ClassPathXmlApplicationContext        //加载类路径下的配置文件,即resources下
        -- FileSystemApplicationContext          //加载本地配置文件
        -- AnnotationConfigApplicationContext    //读取注解配置
2. 常用方法
代码语言:javascript
代码运行次数:0
运行
复制
* getBean(String)
    根据 Bean 的id返回 Bean 的实例,返回值为 Object
* getBean(Class)
    根据字节码文件返回 Bean 的实例,返回值为相应类型,当有对各相同的类型的 Bean 时会报错

四、示例

1. pom
代码语言:javascript
代码运行次数:0
运行
复制
<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.0.5.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.12</version>
    </dependency>
</dependencies>
2. daoimpl (省略Interface dao)
代码语言:javascript
代码运行次数:0
运行
复制
import com.softwareMan.dao.UserDao;

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

public class UserDaoImpl implements UserDao {
    private String name;
    private List<String> list;
    private Map<String,Integer> map;
    private Properties pro;

    public UserDaoImpl(String name, List<String> list, Map<String, Integer> map, Properties pro) {
        this.name = name;
        this.list = list;
        this.map = map;
        this.pro = pro;
    }

    public void show() {
        System.out.println(name + "======" + list + "===========" + map + "===========" + pro);
    }
}
2. serviceimpl (省略 Interface service)
代码语言:javascript
代码运行次数:0
运行
复制
import com.softwareMan.dao.UserDao;

public class UserService {
    private UserDao userDao;

    public UserService(UserDao userDao) {
        this.userDao = userDao;
    }

    public void method() {
        userDao.show();
    }

}
3. applicationContext.xml
代码语言:javascript
代码运行次数:0
运行
复制
<?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="userDao" class="com.softwareMan.dao.impl.UserDaoImpl">
        <constructor-arg name="name" value="123" />
        <constructor-arg name="list" >
            <list>
                <value>123</value>
                <value>123</value>
                <value>123</value>
                <value>123</value>
            </list>
        </constructor-arg>
        <constructor-arg name="map" >
            <map>
                <entry key="sdss" value="23"></entry>
                <entry key="ff" value="23"></entry>
                <entry key="sdffffss" value="23"></entry>
            </map>
        </constructor-arg>
        <constructor-arg name="pro">
            <props>
                <prop key="sss">1111</prop>
                <prop key="ssd">1111</prop>
                <prop key="ffs">1111</prop>
            </props>
        </constructor-arg>
    </bean>

    <bean id="userService" class="com.softwareMan.service.UserService">
        <constructor-arg name="userDao" ref="userDao" ></constructor-arg>
    </bean>
</beans>
4. Test
代码语言:javascript
代码运行次数:0
运行
复制
import com.softwareMan.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringTest {
    @Test
    public void testA() {
        ApplicationContext app = new ClassPathXmlApplicationContext("applicationContext.xml");
        UserService userService = (UserService) app.getBean("userService");
        System.out.println(userService);
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、spring 概述
    • 1. 什么是 spring
    • 2. 使用方法
  • 二、spring 的配置
    • 1. applicationContext.xml
    • 2. Bean的范围
    • 3. Bean的生命周期
    • 3. Bean的实例化
    • 4. Bean的依赖注入(dependency Injection)
  • 三、spring的api
    • 1. ApplicationContext的继承体系
    • 2. 常用方法
  • 四、示例
    • 1. pom
    • 2. daoimpl (省略Interface dao)
    • 2. serviceimpl (省略 Interface service)
    • 3. applicationContext.xml
    • 4. Test
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档