今日内容
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);
}
}