SpringIoc自学自讲

SpringIoc

1.Spring
概念:Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器(框架)。
理念: 使现有技术更加实用 . 本身就是一个大杂烩 , 整合现有的框架技术。
组成:
在这里插入图片描述

		 - 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
		 - Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
		 - Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能 , 集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理任何支持 AOP的对象。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖组件,就可以将声明性事务管理集成到应用程序中。
		 - Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
		 - Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
		 - Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
		 - Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。

2.Ioc思想

  • 控制反转:获得对象的方式反转了,我们之前是new出一个对象,对象的创建由程序控制,控制反转将主动权交给第三方,由第三方创建对象。实现控制反转的主要方式是依赖注入。
  • 理解思想:

先写实体类user

package com.bluemsun.entity;

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

    public User() {
    }

    public User(int uid, String name, int age) {
        this.uid = uid;
        this.name = name;
        this.age = age;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

dao层接口

package com.bluemsun.dao;

import com.bluemsun.entity.User;

public interface UserDao {
    void f();
    User getUserById(int uid);
    User printMessage(User user);
}

dao层实现类
A:

package com.bluemsun.dao;

import com.bluemsun.entity.User;

public class UserDaoImplA implements UserDao{
    @Override
    public void f() {
        System.out.println("这是第一个");
    }

    @Override
    public User getUserById(int uid) {
        return null;
    }

    @Override
    public User printMessage(User user) {
        return null;
    }
}

B:

package com.bluemsun.dao;

import com.bluemsun.entity.User;

public class UserDaoImplB implements UserDao{

    @Override
    public void f() {
        System.out.println("这是第二个");
    }

    @Override
    public User getUserById(int uid) {
        return null;
    }

    @Override
    public User printMessage(User user) {
        return null;
    }
}

现在有两个实现类,如果我们用以前的方法去调用:

package com.bluemsun.service;

import com.bluemsun.dao.UserDao;
import com.bluemsun.dao.UserDaoImplA;

public class UserService {
    private UserDao userDao = new UserDaoImplA();

    public void getUser(){
        userDao.f();
    }
}

这就导致如果我要使用UserDao的另一个实现类时,就需要去service层更改代码。如果有许多实现类,我们每更换一次,就要修改一次代码,这种设计的耦合性太高了, 牵一发而动全身 。
做如下修改:

package com.bluemsun.service;

import com.bluemsun.dao.UserDao;
import com.bluemsun.dao.UserDaoImplA;

public class UserService {
//    private UserDao userDao = new UserDaoImplA();

    private UserDao userDao;
    
    void setUserDao(UserDao userDao){
        this.userDao = userDao;
    }
    
    public void getUser(UserDao userDao){
        userDao.f();
    }
}


如果我们需要更换实现类,只需要利用set方法传入参数设置实现类即可。与之前的区别是对象的创建不是由程序决定,而是由我们决定。
3.SpringIoc

  • 导入jar包
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-webmvc</artifactId>
  <version>5.1.10.RELEASE</version>
</dependency>
  • 编写User实体类
package com.bluemsun.entity;

public class User {

   private int id;
   private String name;

   public User() {
   }

   public User(int id, String name) {
       this.id = id;
       this.name = name;
   }

   public int getId() {
       return id;
   }

   public void setId(int id) {
       this.id = id;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }
}

  • 编写spring文件,可命名为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.xsd">

       <bean id="user" class="com.bluemsun.entity.User">
              <property name="id" value="1"/>
              <property name="name" value="zxy"/>
       </bean>
</beans>
  • 测试
package com.bluemsun;

import com.bluemsun.entity.User;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {
    @org.junit.Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user = (User) context.getBean("user");
        System.out.println(user.getName());
    }
}

User对象由spring创建,user里的属性由spring容器设置,这个过程就叫控制反转。
控制: 控制对象的创建,传统的对象是由代码本身硬性创建出来的,使用spring后由spring创建。
反转: 程序本身不创建对象,而是被动地接收对象。
依赖注入:利用set方法来进行注入。

4.Ioc创建对象方式

  • 使用无参构造:
    User类
package com.bluemsun.entity;

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

   public User() {
       System.out.println("这是无参构造");
   }

   public User(String name, int age) {
       this.name = name;
       this.age = age;
       System.out.println("这是有参构造");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getAge() {
       return age;
   }

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

}

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

    <bean id="user" class="com.bluemsun.entity.User">
        <property name="name" value="zxy"/>
        <property name="age" value="18"/>
    </bean>

</beans>

Test

package com.bluemsun.entity;

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

public class Test {
    @org.junit.Test
    public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        User user1 = (User)context.getBean("user");
        User user2 = (User) context.getBean("user");
    }
}

  • 有参构造
<bean id="user" class="com.bluemsun.entity.User">
        <constructor-arg index="1" value="11"/>
        <constructor-arg index="0" value="zzz"/>
</bean>
//  根据下标构造
<bean id="user" class="com.bluemsun.entity.User">
		<constructor-arg name="age" value="11"/>
        <constructor-arg name="name" value="zzz"/>
</bean>
//  根据参数名构造
<bean id="user" class="com.bluemsun.entity.User">
		<constructor-arg type="java.lang.String" value="zzz"/>
        <constructor-arg type="int" value="11"/>
</bean>
//  根据参数类型构造

在配置文件加载的时候,其中管理的对象就已经初始化了。

5.alias设置别名和import导入配置文件

<alias name="user" alias="u"/>
<import resource="beanss.xml"/>

6.其他注入

  • 数组注入
<property name="s">
            <array>
                <value>阿巴阿巴</value>
                <value>歪比巴不</value>
                <value>hahaha</value>
            </array>
 </property>
  • list注入
<property name="list">
            <list>
                <value>111</value>
                <value>222</value>
                <value>333</value>
            </list>
 </property>
  • map注入
<property name="map">
            <map>
                <entry key="a" value="b"/>
                <entry key="c" value="d"/>
            </map>
</property>
  • set注入
<property name="games">
     <set>
         <value>LOL</value>
         <value>BOB</value>
         <value>COC</value>
     </set>
 </property>
  • Null注入
<property name="wife"><null/></property>
  • Properties注入
<property name="info">
     <props>
         <prop key="学号">20190604</prop>
         <prop key="性别"></prop>
         <prop key="姓名">小明</prop>
     </props>
 </property>

7.p、c命名注入

导入约束 : xmlns:p="http://www.springframework.org/schema/p"
<bean id="address" class="com.bluemsun.entity.Address" p:address="wwwwwww"/>
导入约束 : xmlns:c="http://www.springframework.org/schema/c"
<bean id="address" class="com.bluemsun.entity.Address" c:address="wwwwwww"/>

8.Bean作用域
在这里插入图片描述
9.自动挂载 byname、bytype
10.和MyBatis整合

  • 导入jar包
<dependency>
   <groupId>junit</groupId>
   <artifactId>junit</artifactId>
   <version>4.12</version>
</dependency>
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis</artifactId>
   <version>3.5.2</version>
</dependency>
<dependency>
   <groupId>mysql</groupId>
   <artifactId>mysql-connector-java</artifactId>
   <version>5.1.47</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-webmvc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.springframework</groupId>
   <artifactId>spring-jdbc</artifactId>
   <version>5.1.10.RELEASE</version>
</dependency>
<dependency>
   <groupId>org.mybatis</groupId>
   <artifactId>mybatis-spring</artifactId>
   <version>2.0.2</version>
</dependency>

在这里插入图片描述
剩下的看代码吧。
参考博客:https://blog.csdn.net/weixin_44207403/article/details/106736102

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值