0
点赞
收藏
分享

微信扫一扫

spring基础

dsysama 2022-01-22 阅读 52

1. Spring

1.1 Spring介绍

Spring框架是一个开放源代码的J2EE应用程序框架,由Rod Johnson发起,是针对bean的生命周期进行管理的轻量级容器(lightweight container)。
Spring解决了开发者在J2EE开发中遇到的许多常见的问题,提供了功能强大IOC、AOP及Web MVC等功能。Spring可以单独应用于构筑应用程序,也可以和Struts、Webwork、Tapestry等众多Web框架组合使用,并且可以与 Swing等桌面应用程序AP组合。因此, Spring不仅仅能应用于JEE应用程序之中,也可以应用于桌面应用程序以及小应用程序之中。Spring框架主要由七部分组成,分别是 Spring Core、 Spring AOP、 Spring ORM、 Spring DAO、Spring Context、 Spring Web和 Spring Web MVC。

知识点:
1. J2SE 基础的java语法
2. J2EE JAVA企业级开发
3. J2ME 移动端java开发 手机QQ java写的!!!
4.bean: 由Spring容器管理的对象称之为bean!!!
5.轻量级: 使用spring容器的方式简单/操作便捷.
6.容器: Spring在内存中开辟了一大块空间,用来管理对象.

总结: Spring是开源的J2EE应用框架,是管理Bean生命周期的轻量级容器!!!

1.2 传统项目开发

**1.2.1 创建Dog类**

```java
package com.jt.demo1;

public class Dog {

    public void hello(){
        System.out.println("小狗 不咬人!!!");
    }
}
```

1.2.2 创建Cat类

```java
package com.jt.demo1;

public class Cat {

    public void hello(){
        System.out.println("小猫 掉毛!!!");
    }
}
```


1.2.3 编辑测试类

```java
package com.jt.demo1;

public class User {
    /**
     * 分析这段代码有什么缺点:
     *  1.如果用户需要切换属性.则手动的修改代码
     *  2.每个宠物对象都与当前的类User紧紧的绑定在一起.后期维护不易!!
     *  总结: 这样的程序设计耦合性高
     */
    //用户需要调用hello方法
    private static Cat cat = new Cat();

    public static void main(String[] args) {
        System.out.println("用户调用方法");
        cat.hello();
    }
}
```

1.2.4 测试问题总结:

```java
如果类中的属性通过new 的方式直接绑定. 则类与属性的耦合性高.
如果需要修改属性类型, 则需要修改代码. 后期扩展不方便.
1.3 面向接口开发(重点内容)
1.3.1 定义接口
package com.jt.demo2;

public interface Pet {
    //接口的作用? 抽取一些公共的方法!!!
    void hello();
}
```

1.3.2 定义宠物实现类

## 1.定义狗

```java
package com.jt.demo2;

public class Dog implements Pet{

    @Override
    public void hello() {
        System.out.println("小狗汪汪汪!!!");
    }
}
```


## **2.定义猫**

```java
package com.jt.demo2;

public class Cat implements Pet{


    @Override
    public void hello() {
        System.out.println("小猫 喵喵!!!");
    }
}
```


**1.3.3 定义用户类**

```java
package com.jt.demo2;

public class User {

    //1.用户可以使用接口当做属性
    //2.面向接口开发! 以后方法的属性名称不用修改
    private static Pet pet = new Cat();//多态!!

    public static void main(String[] args) {
        pet.hello();
    }
}
```


1.4 Spring核心-IOC介绍(重点知识)

1.4.1 现在的问题

说明: 当前的Dog/Cat对象与User类紧紧的绑定在一起.所以耦合性高!!!


1.4.2 IOC介绍

Ioc全称Inversion of Control,即“控制反转”,这是一种设计思想。对象创建的权利由Spring框架完成.由容器管理对象的生命周期.
![在这里插入图片描述](https://img-blog.csdnimg.cn/54a6451725f04b34bbf7692daa90bb3c.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYnl0ZTIxMTE=,size_20,color_FFFFFF,t_70,g_se,x_16)

1.4.3 IOC入门案例

1.4.3.1 准备Dog类


package com.jt.demo2;

public class Dog implements Pet{

    @Override
    public void hello() {
        System.out.println("小狗汪汪汪!!!");
    }
}

## 1.4.3.2 准备spring.xml配置文件
![在这里插入图片描述](https://img-blog.csdnimg.cn/bb18200a634841539b5f3d7a51e0e201.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYnl0ZTIxMTE=,size_20,color_FFFFFF,t_70,g_se,x_16)


```xml
<?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">

    <!--1. IOC的机制管理Dog对象
        id: 对象的唯一标识符. 不能重复 见名知意 首字母小写
        class: 类路径
    -->
    <bean id="dog" class="com.jt.demo3.Dog"></bean>

</beans>
```

1.4.3.3 编辑User测试对象

```java
package com.jt.demo3;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class User {
    //IOC!!!!
    public static void main(String[] args) {
        //1.指定配置文件
        String resource = "spring.xml";
        //2.创建容器对象  加载配置文件
        ApplicationContext context =
                new ClassPathXmlApplicationContext(resource);
        //3.从容器中获取对象
        Dog dog = context.getBean(Dog.class);
        //4.调用对象的方法
        dog.hello();
    }
}
```


1.4.3 IOC对象创建-反射机制

```java
package com.jt.demo3;

public class NewDog {

    /**
     *  1.该方法是通过反射的机制实例化对象 !!!框架中的重点!!!
     *  2.反射机制:
     *      java中创建对象的常用的一种方式,指定类型的路径,
     *      之后通过关键方法.newInstance()实例化对象
     *      类比:  xxx.newInstance() ~~ new Dog();
     *  3. 精髓: 为什么用反射/而不是new?
     *      3.1 因为第三方通过反射实例化对象 可以实现松耦合!!
     *      3.2 一般多用于框架,因为框架不清楚用户到底需要啥,只有运行期
     *          才清楚用户到底需要什么对象. 扩展性更好!!!
     *  4. 异常说明:
     *         1.运行时异常   运行期间出错了
     *         2.编译异常/检查异常  编译时提示报错
     */

    public static void main(String[] args) throws ClassNotFoundException, InstantiationException, IllegalAccessException {
        Dog dog = (Dog) Class.forName("com.jt.demo3.Dog")
                .newInstance();
        dog.hello();
    }
}
```


**

 1.4.4 IOC实现原理

**
容器的数据结构: K-V Map<K,V> key=bean中的ID, value=实例化的对象
程序执行过程:
1. 指定配置文件的名称.
2. 当Spring容器加载配置文件时.当按照顺序执行bean标签时,开始创建对象.
3. Spring通过bean标签中的class属性获取类型的路径,之后通过反射机制,实例化对象(必须有无参构造)
4. bean中的Id当做Map中的key, 将实例化的对象保存到Map中,当做value. 至此Spring容器启动成功!!!
5. 当用户需要获取对象时,可以通过key/或者类型 获取对象.

**

## 1.5 Spring注解开发
## **1.5.1关于注解开发说明**
如果是2010年,那么还需要对xml配置文件有所了解,但是引入springboot之后,基本不需要使用xml配置文件了,一般都使用注解开发.
## **1.5.2 编辑配置类**
效果: 和配置文件类似
注解作用: 标识/标记
注解1: @Configuration
注解2: @Bean
注解3: @ComponentScan(“com.jt.demo4”) //包扫描注解: 让spring注解生效!!!
```java
package com.jt.demo4;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration  //标识当前类是配置类
@ComponentScan("com.jt.demo4")  //包扫描注解: 让spring注解生效!!!
public class SpringConfig {
    //作用: 和配置文件类似,管理对象!!!
    /**
     * IOC-写法
     *  1.@Bean 告诉Spring容器,当前方法的名称,为Map中的key
     *    返回值是Map中的value.
     *  2.特殊用法:
     *      常规条件下,Spring通过反射实例化对象.
     *      也可以由用户自己new的方式创建
     * @return
     */
    @Bean
    public Dog dog(){
        return new Dog();
    }
}
```


**1.5.3 编辑测试类**

```java
package com.jt.demo4;

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class User {

    public static void main(String[] args) {
        ApplicationContext context =
                new AnnotationConfigApplicationContext(SpringConfig.class);
        Dog dog = context.getBean(Dog.class);
        dog.hello();
    }
}
```


**1.6 第三阶段所有注解**


常用注解

1.@Configuration 标识当前类是配置类
2.@ComponentScan 包扫描注解 扫描注解
3.@Bean 标识该方法的返回值交给Spring容器管理
4.@Scope 控制多例和单例
5.@Lazy 懒加载
6.@PostConstruct 初始化方法
7.@PreDestroy 销毁方法
8.@Component 将当前类未来的对象交给容器管理
9.@Autowired 按照类型进行注入
10.@Qualifier 按照名称进行注入
11.@Repository 标识持久层注解
12.@Service 标识Service层
13.@Controller 标识Controller层
14.@Value 为属性赋值 @Value("${key}")
15.@PropertySource 加载指定路径的配置文件properties
16.@Aspect 标识当前类是一个切面类
17.@Pointcut 用于定义切入点表达式 表达式写法4种
18.@EnableAspectJAutoProxy 让AOP的注解有效果
19.@Before AOP-前置通知
20.@AfterReturning AOP-后置通知
21.@AfterThrowing AOP-异常通知
22.@After AOP-最终通知
23.@Around AOP-环绕通知
24.@Order(1) //可以利用order关键字 实现AOP的排序 数字越小越先执行.
25.@ResponseBody 将返回的数据转化为JSON串, 如果是字符串本身 原数据返回
26.@RequestMapping("/hello") 实现浏览器的请求路径与方法的映射
27.@PathVariable restFul结构,接收参数的注解.
28.@GetMapping("") 只能接收GET请求类型
29.@DeleteMapping("") 只能接收DELETE请求类型
30.@PostMapping("") 只能接收POST请求类型
31.@PutMapping("") 只能接收PUT请求类型
32.@RestController 表示Controller类,同时要求返回值为JSON
33.@CrossOrigin 允许跨域访问
34.@RequestBody 参数接收时,将JSON串转化为java对象 json中的key与对象的属性一致.
35.@Data lombok动态生成get/set/toString/equals/hashcode等方法
36.@Accessors 控制是否开启链式加载结构
37.@NoArgsConstructor 生成无参构造方法
38.@AllArgsConstructor 生成全参构造方法
39.@Mapper mybatis将当前的接口交给Spring容器管理. Map<类名小写,JDK动态代理对象>
40.@SpringBootTest 该注解的作用在进行代码测试时启动spring容器,之后动态的获取对象 注意41.包路径 主启动类的同包及子包中.
42.@Param Mybatis中将参数封装为Map集合. @Param(“maxAge”) int maxAge
43.@Alias Mybatis中定义对象的别名 @Alias(“User”)
44.@MapperScan Mybatis中扫描指定包路径的接口 为其创建代理对象.
45.@Insert Mybatis 新增操作注解
46.@Update Mybatis 修改操作注解
47.@Delete Mybatis 删除操作注解
48.@Select Mybatis 查询操作注解
49.@Transactional Spring中用来控制事务
50.@RestControllerAdvice Controller层的全局异常处理
51.@ExceptionHandler 按照某种异常类型进行拦截
52.@TableName(“item_cat”) MybatisPlus注解POJO与数据表绑定 注意表名
53.@TableId(type = IdType.AUTO) MybatisPlus注解 标识主键/主键自增
54.@TableField(exist = false) MybatisPlus注解 标识属性是否存在,及名称是否一致

 

**1.7 Spring中的单例和多例问题**

 **1.7.1 概念说明**

单例对象: Spring中保存一份对象.
多例对象: Spring容器负责创建多次对象. 内存中对象多份.

**1.7.2 单例/多例测试**

注解: @Scope(“singleton”)/@Scope(“prototype”)
结论:
1.Spring容器默认条件下,对象都是单例对象. 节省内存空间!!!
2. Spring容器提供了多例对象的方法,一般适用 数据库链接/资源链接等功能…


**1.8 Spring中的懒加载**

知识回顾:
懒汉式: 用户使用时创建.
饿汉式: 不管需不需要都要创建.

懒加载: 默认条件下Spring容器启动时都会实例化对象. 如果用户使用时创建对象,则使用懒加载机制!!!
规则:
1. spring容器启动,对象创建 不是懒加载
2. 当用户使用时创建对象. 是懒加载.

注意事项:
1.如果当前对象是多例模式, 则都是懒加载规则
2.懒加载的控制,只对单例对象有效!!!

举报

相关推荐

0 条评论