JAVA01_31学习总结(Spring注入,整合!)

本文详细介绍了Spring框架中的依赖注入机制,包括通过set方法、构造器和注解方式进行注入。同时,文章还阐述了Spring如何与Mybatis和Servlet进行整合,以实现数据访问和业务逻辑的解耦,以及在实际项目中的应用。
摘要由CSDN通过智能技术生成

今日内容

1. Spring注入

Spring注入
    SpringIOC
        -控制反转或者反转控制,通过Spring容器的工厂模式用反射的方式来创建当前类对象
        -目的是为了降低耦合性
        -核心DI,依赖注入,一个类里面有不同的引用类型或者基本数据类型,如何注入?
            -就是创建了对象,然后给里面的变量赋值-注入
注入方式
    1)set方法注入-最常用
        前提是必须提供setXXX()/getXXX()方法
        bean标签对对应类进行管理
            -bean标签下指定property标签进行注入
                -name属性:要注入的属性的名称
                -value属性:要注入的属性的内容
                -ref属性:关联另一个bean对象的id标识-就是关联另一个对象
package com.szr.pojo;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
/**
 * 用户实体类
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
​
    //基本类型
    private int id ;
    private String name ;
    private int age ;
​
    //自定义引用类型--user实体类和userinfo实体类有关联
    private UserInfo userInfo ;
}
package com.szr.pojo;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
import java.util.List;
import java.util.Map;
import java.util.Set;
​
/**
 * 用户详情实体类
 */
@Data//提供set/get方法,toString方法
@AllArgsConstructor//提供所有的有参构造
@NoArgsConstructor//提供的无参构造
public class UserInfo {
    private String address ;
    private String number ;
    private String udesc ;
​
    //复杂类型
    //map集合
    private Map map ;
    //字符串数组
    private String[] strings ;
    //list集合
    private List list ;
    //set集合类型
    private Set set ;
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
​
    <!--注入方式-->
    <!--set注入-->
    <!--将实体类User管理起来-->
    <bean id="user" class="com.szr.pojo.User">
        <!--注入,就是给里面的变量赋值-->
        <property name="id" value="1"></property>
        <property name="name" value="钟离"></property>
        <property name="age" value="500"></property>
        <!--特殊注入,也就是给这个对象赋值,和下面的管理关联起来,本质就是给变量赋值
            name是自己的名字,ref是关联的id
        -->
        <property name="userInfo" ref="userInfo"></property>
    </bean>
    <!--将实体类UserInfo管理起来-->
    <bean id="userInfo" class="com.szr.pojo.UserInfo">
        <!--注入,给变量赋值-->
        <property name="address" value="往生堂"></property>
        <property name="number" value="13993150960"></property>
        <property name="udesc" value="往生堂的客卿"></property>
        <!--注入,给引用类型赋值-->
        <!--list集合类型-->
        <property name="list">
            <list>
                <value>集合1</value>
                <value>集合2</value>
                <value>集合3</value>
                <value>集合4</value>
            </list>
        </property>
        <!--map集合类型-->
        <property name="map">
            <map>
                <entry key="1" value="键值对1"></entry>
                <entry key="2" value="键值对2"></entry>
                <entry key="3" value="键值对3"></entry>
                <entry key="4" value="键值对4"></entry>
            </map>
        </property>
        <!--set集合类型-->
        <property name="set">
            <set>
                <value>set集合1</value>
                <value>set集合2</value>
                <value>set集合3</value>
                <value>set集合4</value>
            </set>
        </property>
        <!--数组类型-->
        <property name="strings">
            <array>
                <value>数组1</value>
                <value>数组2</value>
                <value>数组3</value>
                <value>数组4</value>
            </array>
        </property>
    </bean>
​
</beans>
package com.szr.test;
​
import com.szr.pojo.User;
import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
/**
 * 测试类
 */
public class SpringTest {
    @Test
    public void springTest(){
        //创建Spring容器,读取xml文件
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //获取bean标签
        User user = (User) context.getBean("user");
        System.out.println(user);
/*
        User(id=1, name=钟离, age=500,
        userInfo=UserInfo(address=往生堂, number=13993150960, udesc=往生堂的客卿,
        map={1=键值对1, 2=键值对2, 3=键值对3, 4=键值对4},
        strings=[数组1, 数组2, 数组3, 数组4],
        list=[集合1, 集合2, 集合3, 集合4],
        set=[set集合1, set集合2, set集合3, set集合4]))
*/
    }
}
注入方式
    2)构造器注入
        前提是必须提供有参构造方法
        bean标签对对应类进行管理
            -bean标签下constructor-arg标签进行注入
                -name属性:要注入的属性的名称
                -value属性:要注入的属性的内容
                -ref属性:关联另一个bean对象的id标识-就是关联另一个对象
    3)p标签注入--最不常用,面试提及即可
        前提条件必须存在set方法
            -需要在xml文件头文件中声明名称空间p
            -xmlns:p="http://www.springframework.org/schema/p"  
注入方式
    4)注解方式注入
        -在配置文件中开启注解扫描
            <context:component-scan base-package="注解所在"/>
        -业务层,服务层使用
            @Service,代替bean
        -数据访问层,持久层
            @Repository
        -控制器层
            @Controller
        -自动注入注解
            @Autowirtd
package com.szr.service;
​
/**
 * 用户服务层,业务接口
 */
public interface UserService {
    /**
     * 获取用户姓名
     * @return 返回用户姓名
     */
    String getUserName();
}
package com.szr.service.impl;
​
import com.szr.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
/**
 * 用户服务层实现类
 */
@Service("userService")
public class UserServiceImpl implements UserService {
    //根据类型自动注入
    @Autowired
    /**
     * 获取用户姓名
     * @return 返回用户姓名
     */
    @Override
    public String getUserName() {
        return "钟离";
    }
}
@Test
public void SpringTest1(){
    ClassPathXmlApplicationContext context =
            new ClassPathXmlApplicationContext("spring-config.xml");
    UserService userService = (UserService) context.getBean("userService");
    String userName = userService.getUserName();
    System.out.println(userName);
    //钟离
}

2. Spring-Mybatis-Servlet整合

最终成型
    利用Spring强大的能力,将所有的关键步骤全部整合
    利用Spring中
        bean对象,id对应class的形式-神似键值对
            -通过提前设置配置文件,从而获取到任意全限定名称,利用反射完成创建实例,解耦!
package com.szr.pojo;
​
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
​
/**
 * 用户实体类
 */
@Data//set/get/toString方法
@AllArgsConstructor//有参构造
@NoArgsConstructor//无参构造
public class User {
    //用户基本信息,数据库字段
    private Integer id ;
    private String name ;
    private Integer age ;
    private String gender ;
}
package com.szr.dao;
​
import com.szr.pojo.User;
import org.springframework.stereotype.Repository;
​
import java.util.List;
​
/**
 * 用户访问数据库接口
 */
@Repository("userDao")//Spring注释注入,数据访问层@Repository
public interface UserDao {
    /**
     * 查找所有用户
     * @return 返回所有用户集合
     */
    List<User> FindAllUser();
}
​
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--配置映射文件,实现对数据库的操作,Mybatis-->
<mapper namespace="com.szr.dao.UserDao">
    <!--设置公共map集合来存储查询到的数据-->
    <resultMap id="baseMap" type="user">
        <!--主键字段-->
        <id property="id" column="id"></id>
        <!--剩下字段-->
        <result property="name" column="name"></result>
        <result property="age" column="age"></result>
        <result property="gender" column="gender"></result>
    </resultMap>
    
    <!--书写sql语句 id是UserDao的对应方法名-->
    <select id="FindAllUser" resultMap="baseMap">
        select * from user
    </select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
        https://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        https://www.springframework.org/schema/context/spring-context.xsd">
    <!--全局注释包扫描-->
    <context:component-scan base-package="com.szr"/>
    
    <!--第一大部分,配置连接数据的数据源,摈弃Mybatis数据源,使用Spring的,连接数据库-->
    <!--配置连接数据库的数据源,利用Spring-jdbc.jar包的DriverManagerDataSource作为数据源
        不在利用Mybatis中自带或者使用德鲁伊,Spring更方便
    -->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--配置数据库连接信息 set注入-->
        <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/spring_szr"></property>
        <property name="username" value="root"></property>
        <property name="password" value="123456"></property>
    </bean>
​
    <!--第二大部分,完成了之前Mybatis中的实现数据访问接口的工作,对应映射关系,实现对数据库的操作
    配置SqlSessionFactory
    Mybatis-Spring整合包提供了SqlSessionFactoryBean对象
    用来配置对应的映射
-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--关联数据源-->
        <property name="dataSource" ref="dataSource"></property>
        <!--配置实体类的别名-->
        <property name="typeAliasesPackage" value="com.szr.pojo"></property>
        <!--dao层接口对应的文件路径-->
        <property name="mapperLocations" value="classpath:mapper/*Dao.xml"></property>
    </bean>
​
    <!--第三部分,将Spring和Mybatis关联起来!!-->
    <bean id="mapperScannerConfigurer" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--关联上面的SqlSessionFactoryBean的实例-->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
        <!--配置数据接口的包扫描-->
        <property name="basePackage" value="com.szr.dao"></property>
    </bean>
</beans>
package com.szr.service;
​
import com.szr.pojo.User;
​
import java.util.List;
​
/**
 * 用户业务层,服务层
 */
public interface UserService {
    /**
     * 查询所有用户
     * @return 返回用户集合
     */
    List<User> FindAllUser();
}
package com.szr.service.impl;
​
import com.szr.dao.UserDao;
import com.szr.pojo.User;
import com.szr.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
​
import java.util.List;
​
/**
 * 用户服务实现类
 */
@Service("userService")//Spring注释注入,服务层注释@Service
public class UserServiceImpl implements UserService {
    @Autowired//自动注入
    //声明UserDao对象,调用时已经通过映射文件,反射的方式创建好了
    private UserDao userDao ;
    /**
     * 查询所有用户
     * @return 返回用户集合
     */
    @Override
    public List FindAllUser() {
        //无需new,直接调用,自动注入已经弄好了
        List<User> users = userDao.FindAllUser();
        //判断,如果不为空且有内容
        if (users!=null && users.size()>0){
            return users;
        }
        return null;
    }
}
package com.szr.controller;
​
import com.alibaba.fastjson.JSONObject;
import com.szr.pojo.User;
import com.szr.service.UserService;
import org.springframework.context.support.ClassPathXmlApplicationContext;
​
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.annotation.*;
import java.io.IOException;
import java.util.List;
​
@WebServlet("/szr")
public class SpringSzrServlet extends HttpServlet {
    private UserService userService ;
    //当服务器启动的时候,访问Servlet时创建对象,所以利用无参构造,完成对服务层的对象的声明和使用
    public SpringSzrServlet(){
        //完成对Spring容器的创建
        ClassPathXmlApplicationContext context =
                new ClassPathXmlApplicationContext("spring-config.xml");
        //获取服务层对象,之前已经注释注入了,方法中直接使用即可
        userService = (UserService) context.getBean("userService");
        System.out.println(userService);
    }
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //处理响应的中文乱码
        response.setContentType("text/html;charset=utf-8");
        //调用方法
        List<User> users = userService.FindAllUser();
        //利用json工具转换为json格式
        String json = JSONObject.toJSONString(users);
        //响应
        response.getWriter().write(json);
    }
​
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

五目炒饭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值