后端框架(3):Spring(1)

发布于:2025-05-17 ⋅ 阅读:(16) ⋅ 点赞:(0)

Spring是什么?

    spring是一个轻量级的,IOC和AOP的一站式Java 开发框架。

    目的是为了简化企业级应用开发而生的。

    轻量级:框架体积小(核心模块)

  IOC:Inversion of Control 控制反转 把创建对象的控制权,反转给spring框架

            以前我们在程序中需要对象,都是自己new,例如:new StudentDao对象

  AOP:Aspect Oriented Programming 面向切面编程

            将程序中的一些公共的非业务代码分离提取出来,然后在业务代码执行时,给他们横切进来。

            使用的动态代理的机制实现,在我们的业务代码,不显示的调用,但是执行业务代码,会通过代理对象,调用非业务代码。

一站式:除了核心的IOC和AOP功能之外,还对数据访问层,web层都有封装,所以是一站式的

Spring 体系结构    

Spring Hello World 搭建

    1、Maven导入spring核心基础jar

<!-- spring-context-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

2、编写spring配置文件

<?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="admin" class="com.ffyc.springpro.model.Admin"> </bean>
</beans>

3、编写一个测试类(Admin)

public class Admin {
    private String account;
    private String password;

    public Admin() {
        System.out.println("Admin 无参构造");
    }

    public Admin(String account, String password) {
        this.account = account;
        this.password = password;
    }

    public String getAccount() {
        return account;
    }

    public void setAccount(String account) {
        System.out.println("setAccount");
        this.account = account;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        System.out.println("getPassword");
        this.password = password;
    }

    @Override
    public String toString() {
        return "Admin{" +
                "account='" + account + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

4、测试spring

        /*
            ClassPathXmlApplicationContext 是spring框架中的一个具体的实现类,负责生成,管理程序中的对象
            可以看作是一个容器,所以一般把spring框架也称为spring容器,或者IOC容器
            new ClassPathXmlApplicationContext("spring.xml");
            getBean("admin"); 从spring框架(容器)中获取到需要的对象
         */

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
           Admin admin = (Admin) applicationContext.getBean("admin");
           Admin admin1 = applicationContext.getBean("admin", Admin.class);

        System.out.println(admin);
        System.out.println(admin1);

                            

IOC(控制反转)

        控制反转 这是一种编程思想

           把生成对象的控制权,反转给spring框架管理,spring框架负责管理对象的整个生命周期过程。 对外提供获取对象的方法。我们在程序中哪里需要使用,在哪里获取即可

spring bean管理

    bean对象,由于把对象交给spring管理后,spring会对对象进行功能的增强,所以在spring框架中生成的对象,统一称为bean对象

    区分这个对象是我们自己new的还是spring框架生成的

spring中bean管理有两种方式:

1、基于xml配置方式
<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype">
<constructor-arg name="account" value="admin"></constructor-arg>
<constructor-arg name="password" value="111"></constructor-arg>
</bean>

<bean id="adminDao" class="com.ffyc.springpro.dao.AdminDao"></bean>

<bean id="adminService" class="com.ffyc.springpro.service.AdminService">
<property name="adminDao" ref="adminDao"></property>
</bean>

        bean 配置需要spring管理的类

        id 生成的对象名

        class 全类名

        name 对象别名,可以为多个

        scope: singleton(默认值):在 Spring 中只存在一个bean实例, 单例模式. prototype:原型 getBean()的时候都会new Bean()

2、基于注解方式
<!--开启spring注解扫描功能  指定扫描的包-->
    <context:component-scan base-package="com.ffyc.springpro"> </context:component-scan>

        注解创建对象

@Component(value = "admin")
@Scope(value = "prototype")
//等同于xml中<bean id="admin" class="com.ffyc.springpro.model.Admin" scope="prototype"> 
@Repository(value = "adminDao")//基于dao层
@Service(value = "adminService")//基于service层

 spring注解方式bean管理

         自动注入

         @Autowired 是spring框架提供的注解

                用于在属性和属性的set方法上,如果用在属性上,set方法都不需要再写了

                默认情况下,要注入的值不能为空,required=true

        自动注入(@Autowired)有两种值的匹配方式:

                 1.通过属性的类型查找 (默认)

                 2.通过对象的名字查找  与@Qualifier(value = "adminDao")一起使用

        @Resource 是java语言中提供的注解标签

                也是添加在属性上,不需要写set方法,注入的值也是不能为空的,也可以通过类型查找要注入的对象,也可以通过对象名字查找要注入的对象 @Resource(name = "adminDao")

注解与 XML 的对比

        注解优点: 方便、直观、高效(代码少,没有配置文件的书写那么复杂)。

        注解缺点:以硬编码的方式写入到 Java 代码中,修改是需要重新编译代码的。

        xml 优点是: 配置和代码是分离的,在 xml 中做修改,无需编译代码,只需重启服务器即可将新的配置加载。

        xml 的缺点是:编写麻烦,效率低,大型项目过于复杂。

Spring 数据访问层管理

        步骤:

        1、在pom.xml中导入Spring-jdbc数据访问层jar包

<!-- spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.2.2.RELEASE</version>
        </dependency>

<!--阿里数据源 数据库连接管理组件-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.10</version>
        </dependency>

        2、在spring.xml中管理数据源对象

              spring管理数据库链接对象

              本次采用阿里巴巴数据库连接管理对象

    <!--
        阿里巴巴数据库连接管理对象,负责生成数据库连接对象,以及提供数据库连接池功能
        让spring管理阿里巴巴数据库连接对象
    -->
    <bean id="druidDataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name = "driverClassName" value = ""></property>
        <property name = "url" value=""></property>
        <property name= "username" value=""></property>
        <property name="password" value=""></property>
        <property name="initialSize" value="10"></property><!--初始化连接数量-->
        <property name="maxActive" value="20"></property><!--最大连接数量-->
    </bean>

Spring集成Mybatis

                Spring集成Mybatis其核心是将SqlSessionFactory交由Spring管理,并由Spring管理对dao接口的代理实现。

        1、在pom.xml中导入mybatis jar包

<!--spring集成mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.1</version>
        </dependency>

        2、在spring.xml中配置sqlSessionFactory

 <!--spring管理生成SqlsessionFactory对象-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="druidDataSource"></property><!--注入数据源-->
        <property name="configLocation" value="classpath:mybatis.xml"></property><!--配置mybatis配置文件-->
        <property name="mapperLocations" value="classpath:mappers/*Mapper.xml"><!--扫描mappers映射文件-->
        </property>
    </bean>

        3、在spring.xml中指定生成接口代理

<!--生成dao包下所有接口的代理对象-->
    <bean id="mapperFactory" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.ffyc.ssm.dao"></property><!--指定接口所在的包-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory">
        </property>
    </bean>