狂人日记day12 && day13

spring

  • spring 是一个开源的免费框架

  • spring是一个轻量级的非入侵的框架

  • 控制反转 面向切面编程

  • 支持事务的处理,对框架整合的支持

springmvc

org.springframework spring-webmvc 5.3.7

org.springframework spring-jdbc 5.3.7

组成

spring官网:https://docs.spring.io/spring/docs/current/spring-framework-reference/core.html

  • springboot

    • 快速开发的脚手架
    • 可以快速开发单个微服务
  • springcloud

    • 基于springboot实现的

学会spring和springmvc后再学springboot

弊端:

  • 发展太久 违背原来的理念

  • 配置十分繁琐

IOC 理论推导

控制反转

之前的业务中,用户的需求会影响原来的代码,我们需要用户的需求去修改原来代码

使用set接口,发生了革命性变化

public void setUserdao(userdao userdao) {this.userdao = userdao;
}
  • 之前程序主动创建对象,控制权在程序员
  • 使用set后 程序不在具有主动性 而是变成了被动的接受对象

这种思想从本质上解决了问题,我们不用再去管理对象的创建。可以更多精力在业务的实现上

这是ioc的原型

hello spring

传统容器创建对象,现在由spring创建

Ioc思想变换

ioc 创建对象的方式

默认无参构造

<bean id="user" class="com.bai.pojo.user"><constructor-arg index="0" value="bai"/>
</bean>

ref 是引用spring容器中创建好的对象

value是具体的值

spring 配置

别名

添加了别名也可以用别名获取对象

<alias name ="user" alias ="user2"/>

id bean的唯一标识符,相当于对象名

import

一般用于团队开发使用

不同的类注册在不同的bean中用import将不同beans。xml合并为总的 最后使用一个总的就可以

applicationContext

构造器注入

set注入

  • 依赖注入:set注入
  • 依赖:bean对象的创建依赖于容器
  • 注入:bean对象中的所有属性,由容器来注入

其他方式

p命名空间

c命名空间

<?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:p="http://www.springframework.org/schema/p"xmlns:c="http://www.springframework.org/schema/c"xsi:schemaLocation="http://www.springframework.org/schema/beanshttps://www.springframework.org/schema/beans/spring-beans.xsd"><!--p命名注入-->
<bean id ="user" class = "com.bai.pojo.user" p:name = "bai" p:age = "18"/>
<!--c命名--><bean id ="user2" class = "com.bai.pojo.user" c:name = "baijiapeng" c:age = "18"/>
</beans>

测试

@Test
public void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");user user = context.getBean("user2", user.class);System.out.println(user);

注意点 p命名和c命名空间不能直接使用,需要导入xml约束

bean作用域

1.单例模式

singleton scope

创建所有实例只有一个

 @Testpublic void test2(){ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");user user = context.getBean("user2", user.class);user user2 = context.getBean("user2",user.class);System.out.println(user.hashCode() == user2.hashCode());}
}

返回结果:

ture 说明是一个

2.原型模式:

每次get时都会产生一个新对象

<bean id ="user2" class = "com.bai.pojo.user" c:name = "baijiapeng" c:age = "18" scope ="prototype"/>

同样测验返回false 说明不是一个

3.其余的request session application

其余在web开发中使用

bean的自动装配

  • 自动装配是spring满足bean依赖的一种方式
  • spring会在上下文中自动寻找并自动给bean装配属性

在spring中有三种自动装配的方式

  1. 在xml中显示的配置
  2. 在java中显示配置
  3. 隐式的自动装配bean

测试

环境:一个人有两个宠物

错误

Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended

解决办法:

打开idea设置,搜索框输入‘async’,去掉如下勾成功解决

byname

会自动在容器上下文中查找和自己对象方法对应的bean id 要和set方法的命名一致

<bean id="people" class="com.bai.poto.people" autowire="byName">

by type

会自动在容器上下文中查找和自己对象类型相同的bean

弊端 – 必须全局唯一

注解实现自动装配

要使用注解

1.导入约束

2.配置注解的支持

注意:context:annotation-config/

<?xml version="1.0" encoding="UTF-8"?>

@autowried

直接在属性上使用即可

也可以在set方法中使用

使用autowired可以不用编写set方法 前提在ioc(spring)容器中存在 且符合名字byname

@nullable 字段标记了这个注解 说明这个注解可以为null

若果@autowried环境比较复杂无法通过一个@autowried

完成 可以配合@qualifier(value =“xxx”)一起使用

@Autowired
private cat cat;
@Autowired
private dog dog;
private String name;

– 通过@resource –

  • 这个没有使用明白

使用注解开发

使用注解需要导入context约束,增加注解的支持

  1. bean

  2. 属性如何注入

  3. 衍生的注解\

    @Repository
    
@Service
@Controller
@Component

功能一样都是将某个类注册到spring容器中装配

4 .自动装配

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MzeoDafG-1621775135028)(/Users/suannai/Library/Application Support/typora-user-images/image-20210523190257639.png)]

5.作用域

@Scope("singleton")

小结:

​ xml与注解:

  • xml更万能

    • 注解不是自己的类使用不了 维护相对复杂
  • xml用来管理bean

  • 注解管理属性的输入

  • 只需要注意一个问题:必须要让注解生效 开启注解支持

使用java的方式配置springconfiguration

在spring4后变成了核心功能

@Component
public class user {private String name;public String getName() {return name;}@Value("bai")public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "user{" +"name='" + name + '\'' +'}';}
}
@Configuration
@ComponentScan("com.bai.pojo")
public class baiconfig {//注册一个bean相当于之前写的一个bean标签//这个方法的名字就相当于bean中的标签 返回值 相当于class@Beanpublic user getuser(){return new user();}
}
@Configuration
@ComponentScan("com.bai.pojo")
@Import(baiconfig.class)
public class baiconfig2 {@Beanpublic user getuser(){return new user();}
}
import com.bai.pojo.user;
import config.baiconfig;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;public class mytest {public static void main(String[] args) {//如果完全按照配置类方式去做,只能通过annotationconfigApplicationContext context = new AnnotationConfigApplicationContext(baiconfig.class);user getuser =(user)context.getBean("getuser");System.out.println(getuser.getName());}
}

代理模式

代理模式的分类

  • 静态代理

1.接口

package demo1;public interface rent {public void rent();
}

2.真实角色

package demo1;public class host implements rent{public void rent(){System.out.println("房东要出租房子");}
}

3.代理角色

package demo1;public class proxy implements rent{private host host;public proxy(){}public proxy(host host){this.host=host;}public void rent(){host.rent();}public void seehouse(){System.out.println("中介看房");}public void hetong(){System.out.println("签合同");}public void fare(){System.out.println("收中介费");}
}

4.客户端访问角色

package demo1;public class client {public static void main(String[] args) {//房东要租房子host host = new host();//代理,中介帮房子租房子proxy proxy = new proxy(host);//直接找中介proxy.rent();proxy.hetong();proxy.fare();proxy.seehouse();}
}
    • 抽象角色:一般会使用接口或抽象类
    • 真实角色:被代理的角色
    • 代理角色:代理真实角色
    • 客户:访问代理对象的人

    好处:

    • 使真实角色更加纯粹
    • 公共也就交给代理角色 实现业务分工
    • 发生拓展方便集中管理

    缺点:

    • 一个真实角色就会产生一个代理角色,代码量翻倍

加深理解:

Spring -08 -demo2 代码

  • 动态代理

    • 和静态代理角色一样
    • 是动态生成的,不是写好的
    • 动态代理分两大类:基于接口的动态代理,基于类的动态代理
      • 基于接口-jdk动态代理
      • 基于类 cglib
      • 基于java字节码实现:javassist

    了解两个类 proxy , invocationHandler:调用处理程序

    • 动态代理类代理的是一恶搞接口,一般代理的是一类业务

狂人日记day12 day13相关推荐

  1. C#操作excel(多种方法比较)

    我们在做excel资料的时候,通常有以下方法. 一.导入导出excel常用方法: 1.用查询表的方式查询并show在数据集控件上. 代码 public static string strCon = & ...

  2. Python实训-15天-博客汇总表

    目录 1.课程安排 1.1.课程介绍 1.2.课程目标 2.课件 2.1.课件and录屏 2.2.练习and案例and作业 3.实训博客笔记 第1周-week1 day01 day02 day03 d ...

  3. 每日一句—英语长难句

    每日一句 艾宾浩斯记忆(自我记忆法) Day1 Day2 Day3 Day4 Day5 Day6 Day7 Day8 Day9 Day10 Day11 Day12 Day13 Day14 Day15 ...

  4. java基础视频25days(毕老师)学习日志(day11、day12、day13)

    day11 ★01 多线程: 进程:是一个正在执行中的程序.       每一个进程执行都有一个执行顺序.该顺序是一个执行路径.      或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元 ...

  5. Python菜鸟入门:day13编程学习

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  6. Python菜鸟入门:day12编程学习

    写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...

  7. java多态口诀,Java之路---Day12(多态),多态Java

    Java之路---Day12(多态),多态Java 2019-10-26-22:40:09 目录: 1.多态的概念 2.多态的分类 3.实现多态的三个必要条件 4.多态的格式 5.多态成员变量的使用特 ...

  8. python速成要多久2019-8-28_Python脱产8期 Day13 2019/4/28

    一 函数的嵌套定义 1在一个函数的内部定义另一个函数. 2.为什么有函数的嵌套定义: # 1)函数fn2想直接使用fn1函数的局部变量,可以讲fn2直接定义到fn1的内部,这样fn2就可以直接访问fn ...

  9. day12 装饰器进阶

    day12 装饰器进阶 #装饰器进阶 #functools.wraps #带参数的装饰器 #多个装饰器装饰用一个函数 def outer(*args,**kwargs):#接收的时候是聚合(成元祖的形 ...

最新文章

  1. ubuntu下 mysql数据 自执行备份
  2. C# Winform编程ListBox之添加图标
  3. Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索
  4. html两个框架同时_两个框架的故事
  5. html列表滑动字母索引,js实现做通讯录的索引滑动显示效果和滑动显示锚点效果...
  6. HWM和delete,drop,truncate的关系
  7. angular cli_使用Angular CLI连接到服务器的最佳方法
  8. 【扯皮】李诞 ▪《笑场》
  9. 服务器的系统搭建,服务器系统搭建
  10. kotlin t class.java_尝试Java,从入门到Kotlin(下)
  11. Verilog实现的多个按键消抖(具体模块可用)
  12. @media实现网页自适应中的几个关键分辨率
  13. 算法设计与分析第二版第一章笔记
  14. 哈理工OJ 1562 字符统计器(水模拟)
  15. 解密SuperWebview的一种另类方法
  16. 【机器学习】十二、一文看懂支持向量机原理
  17. JAVA计算机毕业设计网上图书销售系统(附源码、数据库)
  18. 关于schema文档
  19. 分布式存储系统——《Neo4j》
  20. Poj 2965 The Pilots Brothers‘ refrigerator

热门文章

  1. java中JAO,Java
  2. python自带静态web服务器搭建代码实现(一)
  3. 如何把webp压缩大小?在线webp压缩的工具推荐
  4. 宝塔linux面板负载状态过高,宝塔Linux面板负载状态CPU100%怎么解决
  5. 图解组策略配置禁止修改IE主页
  6. 机械革命无法使用U盘启动linux,机械革命bios设置,教您机械革命bios怎么设置u盘启动...
  7. mysql事务锁死_mysql事务里锁死
  8. WebApp简单制作
  9. Clickhouse Kafka Engin参数记录
  10. 汽车材料QC/T 944-2013ELV中多溴联苯(PBBs)和多溴二苯醚(PBDEs)的检测