文章目录
0. Spring
目的: 解决企业应用开发的复杂性
**功能:**使用基本的JavaBean代替EJB
**spring理念:**使用现有技术更加容易使用,本身是一个大杂烩,整合了现有技术的框架
-Rod Johnson 是Spring Framework 的创始人
官网:https://spring.io/projects/spring-framework#overview
官方下载地址: https://repo.spring.io/ui/native/release/org/springframework/spring
GitHub:https://github.com/spring-projects/spring-framework
https://mvnrepository.com/
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.10</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-jdbc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.10</version>
</dependency>
2.优点
Spring是一个开源的免费框架
Spring是一个轻量级、非入侵的框架
控制反转(IOC),面向切面编程(AOP)
支持事务处理,对框架整合的支持
总结: Spring就是一个轻量级的控制反转(IOC)和面向切面编程(AOP)的框架
3.组成
一,修改端口号
–1,创建application.yml文件
命名固定格式- application.yml
–2.修改端口号
二,SpringBoot热部署
–1, 在pom.xml 添加jar包的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<version>2.5.2</version>
</dependency>
会报错:
未添加 < version>2.5.2
–2,配置选项
组合键: ctrl + shift + alt + / 或者 ctrl + alt + a
–3,改完资源,直接build
三,Lombok热部署
1.作用目的
简化了POJO里的实体类的写法,不用自己写set get tostring…
2,步骤
安装插件
settings–搜lombok–installed
添加jar包的依赖
<!--支持lombok热部署-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.20</version>
</dependency>
修改POJO类
–去掉set get tostring
–给类上加lombok提供的注解
@Data:自动提供 get set tostring equals hashCode
@NoArgsConstructor:提供无参构造
@AllArgsConstructor:提供全参构造
@Accessors(chain = true) : 提供链式编程
package cn.tedu.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Arrays;
import java.util.Date;
@Data//
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
@Accessors(chain = true)//链式编程
public class Student {
//类里面应该提供哪些属性---和页面中name属性的值相同
private String user;
private Integer age;
private Integer sex;
private String[] like;
private Integer edu;
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date intime;
}
3.测试
package cn.tedu.controller;
import cn.tedu.pojo.Student;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("student")
public class StudentController {
@RequestMapping("add")//
public Student add(Student s) {
System.out.println(s);
Student st = new Student();
st.setAge(10);
st.setSex(1);
st.setSex(1);
st.setSex(1);
st.setSex(1);
st.setSex(1);
st.setSex(1);
//lombok提供的链式编程
st.setAge(10).setSex(1).getUser();
return s;
}
}
四,Spring的IOC
1.作用目的
Inversion of Control,控制反转,是指把管理对象的权利交给spring框架。
2,XML方式实现IOC
创建hello类
package cn.tedu.spring;
public class Hello {
void hi(){
System.out.println("hello SPRING");
}
}
创建配置文件,配置类的信息
选中resources-右键-new-xml config…-spring config-输入文件名-回车
<?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">
<!--配置一个类的信息 id是bean的唯一标识 class是类的全路径-->
<!--当配置完成时,spring框架自动IOC,帮你new-->
<!--Map<String,Object>-{hello = new Hello() } -->
<!--Map<String,Object>-{hello = Class.forName("cn.tedu.spring.Hello"). } -->
<bean id="Hello" class="cn.tedu.spring.Hello"></bean>
</beans>
读取配置文件,直接获取对象
package cn.tedu.test;
import org.junit.jupiter.api.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestIOC {
//单元测试junit方法:@Test public void 没有参数
@Test
public void ioc(){
//读取配置文件--参数是文件的路径
ClassPathXmlApplicationContext spring =
new ClassPathXmlApplicationContext("spring-config.xml");
//获取对象--参数是配置文件里bean的id属性值
Object o = spring.getBean("hello");
System.out.println(o);//cn.tedu.spring.Hello@302552ec
//向下造型--专门用子类的资源
Hello h = (Hello) o ;
h.hi();
}
}
总结
–3,注解方式实现IOC
哪个类想让spring框架new,就在类上使用注解:@Component / @Service / @Controller
创建类,使用注解
@Component
package cn.tedu.spring2;
import org.springframework.stereotype.Component;
//Map<类名首字母要小写,类的对象> - {user=new User()}
@Component
public class User {
public void method(){
System.out.println("hello 同桌!");
}
}
创建配置文件,只需要指定包的路径
<?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 http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!--<bean id="Son" class="cn.tedu.spring2.Son"></bean>-->
<!--包扫描:只需要指定从哪个包开始扫描,
注解开发:只需要指定从哪个包开始扫描用了@Component注解类,自动IOC
base-package需要指定一个包的路径-->
<context:component-scan base-package="cn.tedu"></context:component-scan>
</beans>
读取配置文件,获取对象
@Test
public void ioc2(){
ClassPathXmlApplicationContext spring3 =new ClassPathXmlApplicationContext("spring_config2.xml");
Object s = spring3.getBean("son");
System.out.println(s);//cn.tedu.spring.User@2df3b89c
Son sa =(Son)s;
sa.niu();
Object o2 = spring3.getBean("user");
System.out.println(o2);//cn.tedu.spring.User@2df3b89c
User u =(User)o2;
u.method();
}
测试
总结
五,模拟IOC
–1,创建Bean类,描述类的信息
package cn.tedu.myIOC;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
@Data //自动提供 get set tostring equals hashCode
@NoArgsConstructor//无参构造
@AllArgsConstructor//全参构造
@Accessors(chain = true)//链式编程
public class Bean {
private String name;
private String path;
}
–2,创建Spring容器,并指定要维护的类,提供getBean(),根据name获取对象 package cn.tedu.myIOC;
package cn.tedu.myIOC;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class MyIoc {
//1.创建list,存Bean
private List<Bean> beans = new ArrayList<>();
public MyIoc() throws Exception {
Bean b1 = new Bean("猛哥","cn.tedu.spring.Hello");
Bean b2 = new Bean("杰哥","cn.tedu.spring2.Son");
Bean b3 = new Bean("威哥","cn.tedu.spring2.User");
beans.add(b1);
beans.add(b2);
beans.add(b3);
init();
}
Map <String,Object> map = new HashMap<>();
//2.创建map,有对象{ hello = new hello()。user}
public void init() throws Exception {
//遍历list,获取每个bean
for (Bean b : beans){
String key = b.getName();
String q = b.getPath();
Object value = Class.forName(q).newInstance();
map.put(key,value);
}
}
//3.getBean()--根据key获取value
public Object getBean(String name){
return map.get(name);
}
}
–4,总结