Spring升级计划

Spring 技术笔记
Day 1 预热知识
一、 基本术语
Blob类型,二进制对象
Object Graph:对象图,软件工程
AOP:
一、 常识
json 对象和 json字符串转换
JSON.parse(jsonstr);
JSON.stringify(jsonobj);
obj = eval(“(”+jsonStr+”)”);
1.2 classpath理解
classpath指定java运行时需要的class字节码文件所在的位置。
eclipse中.classpath文件有三个作用:
1.源文件的具体位置(kind="src")
2.运行的系统环境(kind="con")
3.工程的library的具体位置信息(kind="lib")
4.项目的输出目录(kind="output")
同时Eclipse中Java项目的build path是依赖于.classpath文件的,build path中指定的位置就是classpath,两个任意一个变化会影响另一个。同时,Java Web项目中,有Java Resource这个选项,它会显示项目中的classpath指定的目录,但是它并非目录,它只是一个便于浏览源文件的一个选项。
问:spring boot 项目 classpath的设置?

二、 简单探索
2.1 Spring 容器
2.2.1 简介
Spring容器是Spring的核心组件,容器会创建对象,并且将对象组装在一起,使用容器来配置对象,管理对象的生命周期。Spring容器使用依赖注入(DI)来管理它的组件。容器会通过扫描metadata来实例化、配置以及组装哪些对象,metadata的类型可以是注解、XML文件或者Java代码。
Spring 提供了两个不同类型的容器,Spring Bean Factory Container 和 Spring ApplicationContext Container,后者包含前者所有的功能,但前者更轻量化。
2.2.2 组成
Core: 提供Spring框架的基础,包括IoC和 依赖注入特性
Bean:提供BeanFactory, 工厂模式的实现
Context:基于Core和Bean模块,访问已经配置和定义的对象的中间层。
SpEL:提供表达式语言用于查询和操作对象。

2.2 依赖注入(控制反转的一种)
2.2.1 概念
一个依赖就是可以被使用的对象(看成一个服务对象),注入就是将依赖传入给一个独立的对象(作为客户对象),只将服务对象传入客户端,而不新建该服务对象(不能new,不能有静态方法),是依赖注入核心。为何需要依赖注入?因为客户对象的依赖不是不变的,是会经常变换的(包括创建的方法),所有客户对象只要知道去哪里去拿服务对象,而不需要知道服务的具体创建方法。(减少程序的耦合)
同时客户对象有责任告诉injector(注入代码)自己的依赖是什么,因为,客户对象不能直接调用injector,而是injector创建服务后,通知客户对象注入服务。可以总结下,客户对象:
(1) 不知道注入代码
(2) 不知道服务的创建过程
(3) 不知道自己使用的是服务的哪个实例
(4) 只知道服务提供的接口即可
(5) 需要告诉injector自己需要注入的依赖
(6) injector能够通知客户对象注入依赖。
2.2.2 客户对象接收依赖的方法[例子]
(0)没有使用依赖注入:
// An Example without dependency injection
public class Client{

private ServiceExample service;

public Client(){
    service = new ServiceExample();
}

public String get(){
    
    return service.getName();
}

}
(1) 构造函数来接收依赖,
public Client(ServiceExample service){
this.service = service;
}
(2) setter方法接收依赖:
public setService(ServiceExample service){
this.service = service;
}

(3) 基于接口的接收方法:让依赖控制自己的注入
// Service setter interface.
public interface ServiceSetter {
public void setService(Service service);
}

// Client class
public class Client implements ServiceSetter {
// Internal reference to the service used by this client.
private Service service;

// Set the service that this client is to use.
@Override
public void setService(Service service) {
    this.service = service;
}

}
服务端需要实现一个含有setService方法的接口。
2.2.2 三种方法对比
(1)构造函数,可以始终保持客户端是有效状态,但是缺少改变依赖的方法灵活性。由于服务是不可以变的所以是线程安全的。
(2)Setter,可以操作服务的状态,但是当依赖多了之后,就很难保证所有依赖已经注入。
由于这些注入可能有失败的情况(传入参数为null),所以还应该有一个检测注入是否完成的方法validateInjection
(3)接口方法,这个的有优点是,服务本身可以不清楚客户的构成,但是也可以接收一个客户参数,同时调用该客户实现的依赖接口方法,从而注入依赖。相当于依赖自己注入到客户中。
2.2.3 组装实现

2.2.2 Spring boot 依赖注入
Spring 通过@ComponentScan来扫描当前注解类目录中的所有组件,并且为这些组件注册Bean。
A 使用标准的Spring 注解来注入
(1)@Autowired 自动从spring 上下文找bean来注入
(2)@ Resource用来指定名称注入(有name属性,默认为字段名)
(3)@Qualifier和@Autowired配合使用,指定bean的名称
@Resource和@Autowired区别?
byName 通过参数名 自动装配,如果一个bean的name 和另外一个bean的 property 相同,就自动装配。
byType 通过参数的数据类型自动自动装配,如果一个bean的数据类型和另外一个bean的property属性的数据类型兼容,就自动装配
作者:wuxinliulei
链接:https://www.zhihu.com/question/39356740/answer/80926247
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
(4)@Service,@Controller,@Repository分别标记类是Service层类,Controller层类,数据存储层的类
(5)@Component是一种泛指,标记类是组件,spring扫描注解配置时,会标记这些类要生成bean。

B. 使用Spring Boot的自动注入
(1)声明注入的对象
(2)创建以该对象为参数的构造函数
private final RiskAssessor riskAssessor;
public DatabaseAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}

Day 2 Spring Boot Basic
一、 pom.xml配置
一个简单的Spring Boot项目继承 spring-boot-starter-parent,同时依赖spring-boot-starter-web(支持MVC等web特性)。(含有starter组件是一批jar的打包)同时我们要设置build插件 org.springframework.boot,这个插件特别方便:
(1) 将所有的classpath下的jar合并成一个über-jar
(2) 搜索public static void main方法,来启动应用
(3) 内置依赖解析器,设置和Spring Boot相应的的依赖版本号。
同时,依靠spring-boot-maven-plugin可以创建可执行的jar或者war包。可以在build标签中添加该插件。

org.springframework.boot
spring-boot-maven-plugin

true


我们在pom.xml有如下关键配置:

org.springframework.boot
spring-boot-starter-parent
1.5.2.RELEASE



org.springframework.boot
spring-boot-starter


二、 注解设置
省略
三、启动入口
// 配置入口
新建一个含有main函数的类Application,函数内调用SpringApplication.run(Application.class,args);同时用注解@SpringBootApplication标记类Application。
@SpringBootApplication该注解等效于三个注解:
@Configuration, 标记某个类是bean定义的来源,该类起配置作用(Spring Boot推荐使用Java来配置而不是XML来配置)
@EnableAutoConfiguration 根据你添加的jar依赖来自动配置Spring的bean,也可以自己添加需要的
@ComponentScan 在这个类所在的目录里面搜索组件(用于获取注解或者配置)
通过 mvn spring-boot:run 启动该类,会启动程序,直接可以访问localhost:8080。
启动加上参数 - - debug 可以输出细节的启动日志。
Application类的位置有一定要求,最好如下设置为项目根目录里面:
com
+- example
+- myproject
+- Application.java
|
+- domain
| +- Customer.java
| +- CustomerRepository.java
|
+- service
| +- CustomerService.java
|
+- web
+- CustomerController.java
Day 3 Spring MVC
一、 基本注解
@Controller 标记某个内类为控制类,该类的方法可以用@RequestMapping编辑请求映射,同时可以返回View以及数据。(ModelAndView)
@RestController 与@Controller不同一点是,更方便返回JSON数据。
二、 静态文件处理
Spring Boot的默认静态文件目录为/static(/public or /resources);同时 Spring Boot自动在静态文件中寻找favicon.ico文件作为网站的favicon,同时在application.properties文件也默认在静态目录下,该文件用来配置一些常见的参数,该配置文件会在例如:搜索的jsp在哪里
spring.mvc.view.prefix: /WEB-INF/jsp/
spring.mvc.view.suffix: .jsp
application.message: Hello Phil
SpringApplication 会加载application.properties文件,自动在下面的目录进行搜索。
(1) 当前目录下/config 子目录下进行搜索
(2) 当前目录
(3) classpath下的/config目录
(4) classpath的根目录
默认的classpath有:src/main/resources;src/main/java;
[? 为何不能放在自己定义的classpath中]
{? 如何拦截jsp页面}
Day 3 Spring With JDBC
一、 核心操作
包含spring-boot-starter-jdbc依赖以及相应的数据库组件。
// 自动注入 JdbcTemplate 组件
@Autowired
JdbcTemplate jdbcTemplate;
JdbcTemplate.excute(sql) 执行sql语句
JdbcTemplate.batchUpdate(sql,list)(list的单个元素要和sql的参数类型数目对应)
(批量插入)
JdbcTemplate.insert(sql,objarray) 插入一个元素
JdbcTemplate.query(sql,interface(rs, rowNum));查询SQL,同时返回rs对象和记录数目
Day 4 Mybatis入门
一、 配置和依赖
依赖:

org.mybatis
mybatis
x.x.x

Mybatis可以通过config.xml来配置(文件放在classpath下面),该文件结构如下:

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> // dtd声明
// 根目录
// 配置多个环境


// 数据库连接池
4个property标签配置:driver;url;username;password




二、SqlSessionFactory的创建
通过config.xml文件来创建:
String resource = ;
InputStream inputStream = Resource.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = SqlSessionFactoryBuilder.build(inputStream);
// 主要关键Resource获取文件输入流
// SqlSessionFactoryBuilder.通过输入流创建SqlSessionFactory
三、sql映射文件
3.1 XML映射
Mybatis的映射文件也可以是XML文件。该文件结构如下:

PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
// root;namespace要唯一


我们可以通过sqlSessionFactory.openSession()来获取一个SqlSession,依次操作数据库。
同时namespace + id的方法获取到响应的的sql语句,并且传入session的方法中去执行。
Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
3.2 注解映射
// 创建 接口,并且定义方法。同时使用@Select注解来标识该方法对应的sql语句
// 映射器方法签名应该匹配相关联的 SqlSession 方法
@Mapper // 必须注册
public interface BlogMapper {
@Select("SELECT * FROM blog WHERE id = #{id}")
Blog selectBlog(int id);
}
// 获取映射,同时执行方法。
BlogMapper mapper = session.getMapper(BlogMapper.class);
Blog blog = mapper.selectBlog(101);

3.3 注册映射
无论是上述哪种方法都需要在config.xml注册xml或者类,需要包括包名。
批量注册interface mapper:

    classpath下面的路径


     


四、XML映射详细
4.1 顶级元素
select,insert,delete,update,resultMap,cache,
sql(定义可以重用的sql片段)
4.2 简单增加,更新,删除(关键对象属性名和关系名映射)

insert into Author (id,username,password,email,bio)
values (#{id},#{username},#{password},#{email},#{bio})


update Author set
username = #{username},
password = #{password},
email = #{email},
bio = #{bio}
where id = #{id}


delete from Author where id = #{id}

4.3 参数
每个句子中可以设置 parameterType 以及resultType (这样能够将对象的属性直接和sql参数对应)resultType可以将结果映射到JavaBean(如果对象名和列名不同,可以如下使用别名
select
user_id as "id",
这里相当于Mybatis在幕后创建一个ResultMap来进行映射了,也可以创建自己的ResultMap,因为很多时候会出现需要的数据没有地方存的时候,存在对象里面又不是很恰当,就可以自定义resultMap。如下:






使用resultMap时,设置查询

select t.* from tableName where id = #{0} and name = #{1}

  
2.2 注解  
public List getXXXBeanList(@Param(“id”)String xxId, 
    @Param(“code”)String xxCode);  
select t.* from tableName where id = #{id} and name = #{code}  // 省略输入参数
2.3 Map封装
public List getXXXBeanList(HashMap map);  
// parameteType设置为java.util.Map通过key来引用值
select 字段... from XXX where id=#{xxId} code = #{xxCode}  

三、Mybatis高级映射
一般情况下,我们都将查询的结果映射到基本的类型,但是在对象模型中不仅仅含有基本类型,对象可能还包含其它对象或者列表,高级映射就是解决这两个映射问题。
现在有这样需求,用户表 t_user 和订单表 t_order(id,user_id),一个用户有很多个订单,
一个订单对应一个用户。
User.java 基本数据(id,name,address,sex,tel),列表(orderList)
Oder.java 类如下: 含有基本类型数据(id,user_id,note),对象数据(User user)
sql 语句:
SELECT t1.*,
t2.username,
t2.sex,
t2.address
FROM
t_order t1,
t_user t2
WHERE t1.user_id=t2.id
现在需求:(1)将查询的结果映射到Oder类中所有的属性(包括User对象)
(2)查询用户的所有订单,并且映射到User类(包括里面的List)
3.1 映射查询的属性到一个POJO对象(一对一)
(1)定义ResultMap,type(映射到的主对象:包名.Order)和id(orderMap)要设置。
(2)配置基本属性映射:column是查询结果属性,property:映射对象的属性


(3)对象映射,使用association来映射,该元素有property(映射的对象属性:user,该对象的类型javaType:包名.User)同理标签内部有属性映射:


3.2 映射查询的属性到一个列表里面(一对多)
collection元素,也有设置property(映射到对象的内部列表名orders);
列表的条目类型javaType(包名Order),映射Order内部属性:


延伸:collection可以使用嵌套来实现多对多,就是说collection元素的javaType设置的对象里面可能还会有List属性(继续使用collection来映射)。
四、Mybatis动态sql
4.1 解决like问题
(1) 传递 #{key},绑定一个key
(2)CONCAT语句,有两种不同。
CONCAT(‘%’,’${name}’,’%’) // 将name值引入sql语句中
CONCAT(‘%’,#{name},’%’) // name作为参数,sql 语句会预编译(推荐)
4.2 sql语句的构建过程
(1)先生成带有?的预编译sql语句
(2)参数传递给根据sql语句生成statement

五、Mybatis日志
在Application.properties 里面配置:
logging.level.com.scsdzchy.wage.dao=DEBUG
Day 9 Spring 简单Session和Cookie
一、 Session 两个注解掌握就OK
1.1 ModelAttribute("user") UserModel user
(1) 使用在方法参数上,表名参数需要来自model,如果model中没有该参数,则会先被实例化然后再放入到model中,一旦出现在模型中,该参数的属性会用有相同名字的请求参数来填充,就是绑定数据到对象。
即被修饰的参数:
A. 使用默认构造函数初始化
B. 会有相同名字的请求参数来绑定它
C. 已经存在model中
1.2 结合@SessionAttributes实现变量的方法
主要表示model中哪些属性、哪些类型属性需要被存在Session中。
@SessionAttribute注释参数,主要用来之前已经存在的全局Seesion变量
二、 Cookie掌握
读取Cookie的值,@CookieValue("test") 使用@CookieValue注解来标识函数参数,以便识别是哪个Cookie(注解参数即为Cookie的key)

Day 9 Spring RestFul
一、 关键要点
注解使用@RestController 或者 @Controller注解类,@ResponseBody注解方法。
同时映射方法返回对象、列表、Map等,Spring MVC会直接返回json对象到前端。(返回的就是对象,ajax中不需要eval 或者 JSON.parse转换)

Day 9 Vue基础入门
一、 Vue实体基础属性:el,data,methods
el :指明Vue需要渲染的区域的元素的id选择。
data:用于创建模板的变量集合,Vue对象代理data变量内容(vue.name == data.name)
methods: 预定义的方法
var vue = new Vue({
el: “#container”,
data:{
name: “vue”
},
methods: {
info:function(){}
}
});
二、模板
2.1 {{name}} 绑定内容,{{ expression }} 只能是表达式
2.2 绑定属性
2.3 双向绑定到变量和view
2.4 事件 调用vue对象中的info方法
2.5 v-bind:title 可以缩写为 :title ; v-on:click 也可以 @click=””
三、指令
3.1

you can see this, if param is true
// 里面不能嵌套,且v-if所在元素不输出
3.2
    {{item}}
列表循环数据
3.3 使用 渲染多元素模块
3.4 循环渲染对象:

{{ key }} : {{ value }}


{{ index }}. {{ key }} : {{ value }}

Day 10 Spring 外部配置文件
Spring Boot主应用可以在application.properties文件中配置很多属性以及key-value变量,可以通过@Value注解将这些配置变量注入应用如下:
@Value("${name}")
private String name;
同时可以通过:@TestPropertySource 以及@SpringBootTest#properties 注解来为测试类指定配置文件。
随机变量:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.uuid=${random.uuid}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}

你可能感兴趣的:(Spring升级计划)