Java学习之Spring框架入门篇

Java学习之Spring框架入门篇

0x00 前言

最近在学SSM的三大框架,上篇文章,已经更新了Mybatis的相关内容,那么这篇文章就来写写Spring的入门。

0x01 Spring 概述

Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。

它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 J2EE 应用程序开发提供集成的框架。

Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。Spring的核心是控制反转(IoC)和面向切面(AOP)。

0x02 Spring使用的意义

首先我们来看一段代码。

dao接口:

package com.test.dao;
public interface userdao {
    void select();
}

mysqldaoimpl:

package com.test.dao;

public class mysqldaoimpl implements userdao{
    public void select() {
        System.out.println("mysqldaoimpl");
    }
}


mssqldaodimpl:

package com.test.dao;

public class mssqldaoimpl implements userdao {
    public void select() {
        System.out.println("mssqlselect ");
    }
}

test类:

package com.test.domain;

import com.test.dao.mysqldaoimpl;
import com.test.dao.userdao;

public class test1 {
    public static void main(String[] args) {
        userdao mysqldaoimpl = new mysqldaoimpl();
        mysqldaoimpl.select();
    }
}

具体的实现就不写了,这里只是演示一下区别。

这里写了一个接口代表某一个查询方法,然后写了2个实现类,分别是mysql的连接和mssql的连接查询。

我们可以注意到,我们在test类里面想要调用mysql的方法就直接new了一个实现类的对象,那么如果在后面想要mssql的查询的话,就需要修改代码,这样的代码效率不高,而且在后面代码如果多了也不好改了。而且这样写的话控制权全在开发者手里,而不是在用户的手里,要实现什么样的功能控制权应该是在用户手里,而不是开发者手里。

那么这里就可以用到 Spring框架,来实现。虽然是也有其他办法能解决这个问题,但是实现起来代码比较繁琐,那么我们为什么不用更加简单便捷的方法呢?

0x03 Spring 使用

首先也还是配置一下spring的坐标。

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-web</artifactId>
            <version>5.2.7.RELEASE</version>
        </dependency>

配置完成后,就来配置一下我们的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="mysqldaoimpl" class="com.test.dao.mysqldaoimpl"/>

    <bean id="mssqldaoimpl" class="com.test.dao.mssqldaoimpl"/>


</beans>

test类:

package com.test.domain;


import com.test.dao.userdao;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test1 {
    public static void main(String[] args) {
         ApplicationContext cl = new ClassPathXmlApplicationContext("bean.xml");  //传入xml文件
        userdao mysqldaoimpl = (userdao)cl.getBean("mysqldaoimpl");  //获取mysqldaoimpl方法
        mysqldaoimpl.select();//调用mysqldaoimpl方法
    }
}

配置并直接传入xml文件,并获取一下方法,就可以直接来调用方法就可以使用了。无需在new实现类的实例化对象。

Bean标签详解:

作用:

用于配置对象让 spring 来创建的。

默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

属性:
id: 给对象在容器中提供一个唯一标识。用于获取对象。

class: 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。

*scope: 指定对象的作用范围。
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么
*globalSession 相当于 session.
*init-method: 指定类中的初始化方法名称。
*destroy-method: 指定类中销毁方法名称。

0X04 依赖注入

bean对象的创建来于容器,bean对象中的所有属性,都有容器来注入。下面来看看常用的几种注入方式

构造注入

构造注入:顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置
的方式,让 spring 框架来为我们注入。

首先定义一个实体类:

package com.test.doamin;


import java.util.Date;

public class Perpon {
    private String name;
    private Integer age;

    public Perpon() {
    }

    @Override
    public String toString() {
        return "Perpon{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

    public Perpon(String name, Integer age, Date date) {
        this.name = name;
        this.age = age;
        this.date = date;
    }

    public String getName() {
        return name;
    }

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

    public Integer getAge() {
        return age;
    }

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

    public Date getDate() {
        return date;
    }

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

    private Date date;

}

在平时我们都是直接在new的时候,或者是使用set方式对他进行赋值,那么在spring框架下,只需要配置一下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="person" class="com.test.doamin.Perpon">

    <constructor-arg name="name" value="xiaoming"/>
        <constructor-arg name="age" value="18"/>
        <constructor-arg name="date" ref="now"/>


    </bean>
    <bean id = "now" class="java.util.Date"/>


</beans>

test类:

    public static void main(String[] args) {
         ApplicationContext cl = new ClassPathXmlApplicationContext("bean.xml");  //传入xml文件
        Perpon person = (Perpon) cl.getBean("person");
        System.out.println(person);
    }
}

注意事项:

类中需要提供一个对应参数列表的构造函数。

然后我们就可以看到执行结果了。

Perpon

把person打印出来,这里看到这些成员变量都被赋值了,是由我们框架去完成的。

constructor-arg标签属性:

index:指定参数在构造函数参数列表的索引位置

type:指定参数在构造函数中的数据类型

name:指定参数在构造函数中的名称 

value:它能赋的值是基本数据类型和 String 类型

ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean

Set 注入

 <bean id="person" class="com.test.doamin.Perpon">
        
    <property name="name" value="xiaoming"/>
    <property name="age" value="18"/>
    <property name="date" ref="now"/>
        

    </bean>
    <bean id = "now" class="java.util.Date"/>

property标签属性:

name:找的是类中 set 方法后面的部分
ref:给属性赋值是其他 bean 类型的
value:给属性赋值是基本数据类型和 string 类型的
实际开发中,此种方式用的较多。

0x05 结尾

在前面看到这个东西其实是懵的,后来看着看着发现其实还是挺简单的,大部分都是一些概念上的东西比较难以理解,但是一般框架使用都比较简单。

posted @ 2020-08-30 07:44  nice_0e3  阅读(1107)  评论(0编辑  收藏  举报