Spring学习笔记(一)——IOC

一、Spring

1.1 依赖


<dependency>
    <groupId>org.springframeworkgroupId>
    <artifactId>spring-webmvcartifactId>
    <version>5.2.7.RELEASEversion>
dependency>

1.2 优点

  • 开源的免费框架
  • 轻量级、非入侵的框架
  • 控制反转(IOC),面向切面编程(AOP)
  • 支持事务的处理,对框架整合的支持

1.3 组成

Spring学习笔记(一)——IOC_第1张图片

1.4 扩展

  • Spring Boot
    • 一个快速开发的脚手架
    • 基于SpringBoot可以快速开发单个微服务
    • 约定大于配置
  • Spring Cloud
    • 基于Spring Boot实现

二、IOC

控制反转是一种通过描述(在 Java 中可以是 XML 或者注解)并通过第三方(Spring)去产生或获取特定对象的方式。

2.1 用普通java实现

当我们写一个普通项目时,一般是这样的

Spring学习笔记(一)——IOC_第2张图片

package dao;

public interface UserDao {
    void query();
}
package dao;

public class UserDaoimp implements UserDao {
    public void query(){
        System.out.println("查询用户");
    }
}
package service;

import dao.UserDao;
import dao.UserDaoimp;

public class userService {
    private UserDao userDao = new UserDaoimp();

    public void query(){
        userDao.query();
    }
}

假设现在用户有了新的需求,又多了一个UserDao的实现类

package dao;

public class MysqlDaoImp implements UserDao {

    public void query() {
        System.out.println("mysql查询");
    }
}

服务层调用这个类时,还需要去改变服务层代码

package service;

import dao.MysqlDaoImp;
import dao.UserDao;
import dao.UserDaoimp;

public class userService {
    private UserDao userDao = new MysqlDaoImp();

    public void query(){
        userDao.query();
    }
}

这样用户的需求会影响可能会影响我们的代码,我们需要根据用户的需求去修改源代码,在一个大的项目中,如果代码量过大,这个过程的成本是很高的

解决方法:set

public class userService {
    private UserDao userDao;

    public void setUserDao(UserDao userDao) {
        this.userDao = userDao;
    }
}
  • 以前UserDao对象是由程序决定的,现在是由程序员来觉得的
  • 使用set后,服务层被动的接受由程序员给他传递来的对象,主动权在程序员

这就是控制反转的基本思想,这个例子我觉得太小了,理解可能不是那么深,但意思我还是能理解的,因为刚开始学,我觉得后面可能会理解的更深入

控制反转IoC(Inversion of Control),是一种设计思想,DI(依赖注入)是实现IoC的一种方法 , 我们使用面向对象编程 , 对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制,控制反转后将对象的创建转移给第三方

2.2 helloSpring

IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

beans.xml


<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="..." class="...">  
        
    bean>

    <bean id="..." class="...">
        
    bean>

    

beans>

编写一个实体类

package pojo;

public class hello {

    private String name;

    @Override
    public String toString() {
        return "name:" + this.getName();
    }

    public String getName() {
        return name;
    }

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

获取Spring上下文对象

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");

配置beans.xml



<bean id="hello" class="pojo.Hello">
    
     <property name="name" value="Spring"/>
bean>

测试使用

@Test
     public void test(){
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
		
        //通过IOC容易获得对象
        //可以进行类型强转
        Object hello = context.getBean("hello");

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

对象的属性设置和对象的创建都是由Spring执行的,当我们需要不同的操作时,只需要在xml文件中去修改就行了,无须操作我们的程序源码

2.3 将2.1的java实现改为Spring

daos.xml


<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
        https://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="userDao" class="dao.UserDaoImp"/>
    <bean id="mysqlDao" class="dao.MysqlDaoImp"/>
	
    <bean id="userService" class="service.UserService">
        <property name="userDao" ref="mysqlDao"/>
    bean>
beans>

测试

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

        UserService userService = (UserService)context.getBean("userService");

        userService.getUserDao().query();
    }

2.4 IOC创建对象的方式

2.4.1 使用无参构造

package pojo;

public class User {
    private String name;
    private int age;
    
    public User() {
        System.out.println("User的无参构造");
    }

    @Override
    public String toString() {
        return "name = " + this.getName();
    }

    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;
    }
}

    <bean id="user" class="pojo.User">
        <property name="name" value="xiaoming"/>
        <property name="age" value="18"/>
    bean>

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cnka5C6x-1595584943711)(C:%5CUsers%5CWIN10%5CDesktop%5C%E6%96%87%E4%BB%B6%5CSpring.assets%5C1595583915174.png)]

会默认调用无参构造方法

2.4.2 使用有参构造方法

  1. 下标赋值

        <bean id="user1" class="pojo.User">
            <constructor-arg index="0" value="xxx"/>
            <constructor-arg index="1" value="3"/>
        bean>
    
  2. 根据参数类型赋值

    <bean id="user2" class="pojo.User">
            <constructor-arg type="java.lang.String" value="xxxx"/>
            <constructor-arg type="int" value="11"/>
    bean>
    

    当参数中出现相同类型参数时,该方式不推荐使用

  3. 根据参数名赋值

    <bean id="user3" class="pojo.User">
        <constructor-arg name="name" value="qqq"/>
        <constructor-arg name="age" value="222"/>
    bean>

=“xxxx”/>


当参数中出现相同类型参数时,该方式不推荐使用

3.  根据参数名赋值

```xml
    
        
        
    

你可能感兴趣的:(Spring)