Spring学习笔记1.1--入门实验

Spring Framework

开发工具:IDEA Professional,JDK1.8及以上,Maven工具

容器核心组件:

Beans:表示对所以Bean对象的管理,主要是包含了对象间的关系配置,以及一些对象实例化操作;

Core:包含了最底层的开发支持,例如:依赖的注入关系、资源文件的访问,数据类型的转换;

Context:提供的是一个完整的容器上下文,在这个上下文之中可以处理对象的生命周期或者是事务;

表达式语言模块: 利用SpELl实现表达式语言的操作,以增强String的功能。

切面编程:

AOP:是整个Spring的灵魂所在,利用切面编程来解决所有的辅助型操作;

Aspect:切面编程的语法支持;

Instrumentation:主要用于检测JVM在运行中代码的动态处理过程;

数据访问模块:

JDBC:在Java之中,对于数据库的操作只有JDBC一种操作形式,在Spring中提供有ORMapping框架,这个框架就利用JDBC半原生完成;

ORM:ORMapping框架的处理操作可以方便的整合:JDO、Hibernate、iBatis和MyBatis等常见组件;

OXM:提供了一个对象对XML文件之间的互相转换;

JMS:提供有消息服务的支持;

Transactions:在数据访问模块支持事务的操作处理;

Web支持模块:

MVC:Spring提供有自己的MVC实现(是目前实现最好的一种);

Struts:Spring方便的支持Struts2.x的管理;

Servlet:自己复制处理MVC的Servlet程序类;

整个Spring完成承办了一个项目能够独立开发并且可以容纳其他框架的综合性框架。

Spring中避免了关键字new造成耦合的问题,Spring不需要进行明确的引用关系传递,直接通过配置完成,Spring编程 = Factory设计模式+Proxy设计模式。

控制反转IOC(Inversion Of Control):

是一种包装的技术类型,使得所有对象实例化的处理操作都不再需要关键字new,控制反转指的就是将对象的创建权反转给了Spring,其作用是实现了程序的解耦合;

底层实现原理:工厂设计模式+反射+XML配置文件。 对于DAO持久层(data access object,数据访问对象),先创建一个接口,然后再创建接口对应的实现类。

创建项目:

首先用IDEA创建项目,如下图:

后面选择Spring支持包就行了,然后有Maven的仓库路径,选择自己已安装的路径就行了。

如下图创建resources文件夹,右击选择MakeAs-> Resources Root,然后创建applicationContext.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">
    
</beans>

之后创建Service文件夹,创建IService接口,提供 一个 dosomething();方法,然后写一个该接口的实现类IServiceImp:

@Override
public void dosomething() {
    System.out.println("This is My first Spring project");
}

 之后创建一个测试类test,使用ApplicationContext创建ctx对象调用 applicationContext.xml文件,获取Iservice的实现类,

再调用里面的方法,同时在applicationContext.xml文件中添加bean对象,指定实现类的路径

<bean id="IService" class="com.project.service.IServiceImpl"/>

demo:

import com.project.service.IService;
import com.project.service.IServiceImpl;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        IService service = ctx.getBean("IService", IServiceImpl.class);
        service.dosomething();
    }
}

运行结果:

依赖注入(DI):利用配置文件的关系来决定类之间的引用关系以及数据的设置操作。

  1. 构造方法的注入:默认情况下如果在applicationContext.xml文件中配置的程序都可以自动通过Spring容器加载时自动的进行对象的实例化操作。但是自动进行初始化的时候调用的是类中的无参构造方法,通过反射机制如果类中提供无参构造方法一定比提供有参构造方法更加容易。

但是Spring里面简化了反射机制,利用Spring中的动态的特性可以直接明确调用构造方法传递参数。

Demo:定义一个类:

public class Detp {
    private int DetpId;
    private String DetpName;
    public Detp(int DetpId,String DetpName){
        this.DetpId = DetpId;
        this.DetpName = DetpName;
    }

    @Override
    public String toString() {
        return "部门编号: "+DetpId+"  部门名称: "+DetpName;
    }
}

通过applicationContext.xml配置进行构造方法参数赋值,使用index指定参数位置:

<bean id="dept" class="com.project.detp.Detp">
    <constructor-arg index="1" value="后端部"></constructor-arg>
    <constructor-arg index="0" value="1"></constructor-arg>
</bean>

编写测试类,通过加载配置文件,找到id为dept的对象进行输出:

public class testDetp {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Detp detp = ctx.getBean("dept",Detp.class);
        System.out.println(detp);
    }
}

输入结果:

利用setter注入 

通过setter & getter方法设置类的属性

在传统的操作中一定是首先实例化Dept类,调用setter设置内容,利用Spring动态设置内容,在applicationContext.xml中通过property设置每一个属性对应的值

<bean id="dept" class="com.project.detp.Detp">
    <property name="detpId" value="1"/>
    <property name="detpName" value="开发部"/>
</bean>

    利用setter注入的强大之处在于可以引用其他类型的Bean对象。

    编写员工类,设置三个属性,setter & getter:

public class Employee {
    private int emp_id;
    private String emp_name;
    private Detp detp;
    public int getEmp_id() {
        return emp_id;
    }
    public void setEmp_id(int emp_id) {
        this.emp_id = emp_id;
    }
    public String getEmp_name() {
        return emp_name;
    }
    public void setEmp_name(String emp_name) {
        this.emp_name = emp_name;
    }
    public Detp getDetp() {
        return detp;
    }
    public void setDetp(Detp detp) {
        this.detp = detp;
    }
    @Override
    public String toString() {
        return "雇员编号: "+this.emp_id+",员工姓名: "+this.emp_name+",所属部门:"+this.detp;

    }
}

    然后通过配置文件决定属性的之间的操作关系:

<bean id="emp" class="com.project.detp.Employee">
    <property name="emp_id" value="15801"/>
    <property name="emp_name" value="Vlad Craste"/>
    <!--ref引用其他Bean对象的内容-->
    <property name="detp" ref="dept"/>
</bean>

编写员工测试类:

public class TestEmp {
    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        Employee employee = ctx.getBean("emp",Employee.class);
        System.out.println(employee);
    }
}

点击运行测试类 :

发布了58 篇原创文章 · 获赞 31 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/qq_37504771/article/details/103115063
今日推荐