大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。
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{name=’xiaoming’, age=18, date=Sun Aug 30 05:32:35 CST 2020}
把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 结尾
在前面看到这个东西其实是懵的,后来看着看着发现其实还是挺简单的,大部分都是一些概念上的东西比较难以理解,但是一般框架使用都比较简单。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119930.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...