发表于: 2020-11-13 23:16:43

1 1465


今天完成的事情:

spring中context:component-scan的作用

自动扫描在指定包下,若某类带有特定注解,@Component、@Repository、@Service、@Controller,则会将这个对象作为Bean注册到Spring容器中。
bean是什么?spring容器又是什么?@Component、@Repository、@Service、@Controller分别是什么?
bean是一个对象,根据bean规范写出的一个类。bean规范:1.所有属性都为private  2.提供默认构造方法  3.提供getter和setter方法   4.实现 serializable(序列化)接口


感觉这个spring  bean和 Java  bean挺像的,但两者确实不是同一个概念。 SpringBean是受Spring管理的对象  所有能受Spring容器管理的对象都可以成为SpringBean. JavaBean是一种JAVA语言写的可重用组件。JavaBean符合一定规范写的Java类,是一种规范。bean规范就是Javabean规范吧。



Java bean和spring bean的区别:
用处不同:传统javabean更多地作为值传递参数,而spring中的bean用处几乎无处不在,任何组件都可以被称为bean。
写法不同:传统javabean作为值对象,要求每个属性都提供getter和setter方法;但spring中的bean只需为接受设值注入的属性提供setter方法。
生命周期不同:传统javabean作为值对象传递,不接受任何容器管理其生命周期;spring中的bean有spring管理其生命周期行为。
所有可以被spring容器实例化并管理的java类都可以称为bean。
原来服务器处理页面返回的值都是直接使用request对象,后来增加了javabean来管理对象,所有页面值只要是和javabean对应,就可以用类.GET属性方法来获取值。javabean不只可以传参数,也可以处理数据,相当与把一个服务器执行的类放到了页面上,使对象管理相对不那么乱(对比asp的时候所有内容都在页面上完成)。
spring中的bean,是通过配置文件、java config等的设置,有spring自动实例化,用完后自动销毁的对象。让我们只需要在用的时候使用对象就可以,不用考虑如果创建类对象(这就是spring的注入)。一般是用在服务器端代码的执行上。
Java bean:


spring bean:


spring 容器用来管理对象和依赖,以及依赖注入( 在Spring框架下,当Bean实例 A运行过程中需要引用另外一个Bean实例B时,Spring框架会创建Bean的实例B,并将实例B通过实例A的构造函数、set方法、自动装配和注解方式注入到实例A,这种注入实例Bean到另外一个实例Bean的过程称为依赖注入。
参考这个



了解一下@Resource(资源)注解(注释是给人看的,注解是给程序看的。还有注解的注解)的作用:
将@Resource注解  注释,会发现sqlSession变灰了,证明SqlSessionTemplate并没有注入进来,所以也无法获取sqlSession方法。运行会报错java.lang.NullPointerException(空指针),也显示找不到sqlSession,可能为空。
那么@Resource的作用就是将实例B通过实例A的构造函数、set方法、自动装配和注解方式注入到实例A中


SqlSessionTemplate在spring-config中被当作bean注入到StudentServiceImpl实现类中


在网上搜了一下发现spring提供了两张注解模式@Autowired和@Resource
了解一下@Autowired注解
@Autowired 注解,可以对Bean类成员变量、方法及构造函数进行标注,完成依赖注入的自动装配工作。使用@Autowired可以省略Bean类的待依赖注入对象的set方法,@Autowired默认情况下按照依赖注入对象的类型自动进行匹配。加入@Autowired注解的方式是在Bean类依赖注入对象的前面加上@Autowired语句。
感觉和 @Resource类似
查看@Autowired  源码


根据网上的解释作用应该是这个:
@Autowired还提供required的属性,用来处理当注入的Bean实例不存在的情况。required为true时,如果注入的Bean实例不存在,程序会抛出异常;required为false时,如果注入的Bean实例不存在,程序会忽略。
网上对于@Resource的解释:
@Resource注解的功能和@Autowired注解功能相近,@Resource有name和type两个主要的属性。Spring容器对于@Resource注解的name属性解析为bean的名字,type属性则解析为bean的类型。因此使用name属性,则按byName模式的自动注入策略,如果使用type属性则按 byType模式自动注入策略。如果两个属性都未指定,Spring容器将通过反射技术默认按byName模式注入
了解到spring有四种依赖注入方式, 分别是基于构造函数的依赖注入、基于设置函数的依赖注入、基于自动装配的依赖注入、基于注解的依赖注入。
目前了解和使用到的只有基于注解的依赖注入
优化代码:
先将spring-config.xml文件的SqlSessionTemplate注释掉,原因:因为可以直接调用接口StudentQueryMapper中的方法,没必要在使用SqlSessionTemplate多此一举。
SqlSessionTemplate的作用:SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。


StudentServiceImpl修改内容如下:
package com.jnshu.service.impl;
import com.jnshu.Pojo.Student;
import com.jnshu.service.StudentService;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.stereotype.Service;
import com.jnshu.Mapper.StudentQueryMapper;
import javax.annotation.Resource;
@Service
public class StudentServiceImpl implements StudentService {
// // 使用 @Autowired 也可以,@Resource 功能更单一,只能取出bean
// @Resource
// private SqlSessionTemplate sqlSession;
@Resource
private StudentQueryMapper studentQueryMapper;
// @Override
// public Student findStudentById(int id) throws Exception {
// Student student = sqlSession.selectOne("com.jnshu.Mapper.StudentQueryMapper.findStudentById", id);
// return student;
// }
@Override
public Student findStudentById(int id) throws Exception {
return studentQueryMapper.findStudentById(id);
}
// @Override
// public Student findStudentByname(String name) throws Exception {
// Student student = sqlSession.selectOne("com.jnshu.Mapper.StudentQueryMapper.findStudentByname", name);
// return student;
// }
@Override
public Student findStudentByname(String name) throws Exception {
return studentQueryMapper.findStudentByname(name);
}
// @Override
// public Student findStudentByStudentId(int StudentId) throws Exception {
// Student student = sqlSession.selectOne("com.jnshu.Mapper.StudentQueryMapper.findStudentByStudentId", StudentId);
// return student;
// }
@Override
public Student findStudentByStudentId(int StudentId) throws Exception {
return studentQueryMapper.findStudentByStudentId(StudentId);
}
// @Override
// public int insertStudent(Student student) throws Exception {
// sqlSession.insert("com.jnshu.Mapper.StudentQueryMapper.insertStudent", student);
// return student.getId();
// }
@Override
public int insertStudent(Student student) throws Exception {
return studentQueryMapper.insertStudent(student);
}
// @Override
// public boolean deleteStudent(int id) throws Exception {
// int i = sqlSession.delete("com.jnshu.Mapper.StudentQueryMapper.deleteStudent", id);
// if (i > 0) {
// return true;
// } else {
// return false;
// }
// }
@Override
public boolean deleteStudent(int id) throws Exception {
return studentQueryMapper.deleteStudent(id);
}
// @Override
// public boolean updateStudent(Student student) throws Exception {
// int i = sqlSession.update("com.jnshu.Mapper.StudentQueryMapper.updateStudent", student);
// if (i > 0) {
// return true;
// } else {
// return false;
// }
// }
@Override
public boolean updateStudent(Student student) throws Exception {
return studentQueryMapper.updateStudent(student);
}
}

StudentService接口不变,测试类也不变,运行成功



明天计划的事情:

继续学习spring, Server入门, spring mvn入门



遇到的问题:
第一个问题(红字标识

我在想为什么用StudentQueryMapper来代替SqlSessionTemplate(如下图所示),(有一个原因是不使用硬编码)然后查了一下SqlSessionTemplate的作用(SqlSessionTemplate是MyBatis-Spring的核心。这个类负责管理MyBatis的SqlSession,调用MyBatis的SQL方法,翻译异常。)



MyBatis的SQL方法是什么?搜了一下,是(图一)。现在把SqlSessionTemplate注释掉,也就无法使用这些方法了。那么使用得是StudentQueryMapper中的方法(图二),StudentQueryMapper中的方法的目的是传入StudentQueryMapper.xml中的SQL语句(图三),如果不使用SqlSessionTemplate,那么是那个将SQL语句传入到数据库进行增删改查的呢?答案应该是(图四),但是我不知道它是怎么运行的?
1.

2.


3.


4.




收获:一堆以前未解决的问题





返回列表 返回列表
评论

    分享到