狂人日记day12 day13
狂人日记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中有三种自动装配的方式
- 在xml中显示的配置
- 在java中显示配置
- 隐式的自动装配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约束,增加注解的支持
bean
属性如何注入
衍生的注解\
@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相关推荐
- C#操作excel(多种方法比较)
我们在做excel资料的时候,通常有以下方法. 一.导入导出excel常用方法: 1.用查询表的方式查询并show在数据集控件上. 代码 public static string strCon = & ...
- Python实训-15天-博客汇总表
目录 1.课程安排 1.1.课程介绍 1.2.课程目标 2.课件 2.1.课件and录屏 2.2.练习and案例and作业 3.实训博客笔记 第1周-week1 day01 day02 day03 d ...
- 每日一句—英语长难句
每日一句 艾宾浩斯记忆(自我记忆法) Day1 Day2 Day3 Day4 Day5 Day6 Day7 Day8 Day9 Day10 Day11 Day12 Day13 Day14 Day15 ...
- java基础视频25days(毕老师)学习日志(day11、day12、day13)
day11 ★01 多线程: 进程:是一个正在执行中的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径. 或者叫一个控制单元. 线程:就是进程中的一个独立的控制单元 ...
- Python菜鸟入门:day13编程学习
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...
- Python菜鸟入门:day12编程学习
写在前面: 此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 传送门: day01基础知识 day02知识分类 day03 ...
- java多态口诀,Java之路---Day12(多态),多态Java
Java之路---Day12(多态),多态Java 2019-10-26-22:40:09 目录: 1.多态的概念 2.多态的分类 3.实现多态的三个必要条件 4.多态的格式 5.多态成员变量的使用特 ...
- python速成要多久2019-8-28_Python脱产8期 Day13 2019/4/28
一 函数的嵌套定义 1在一个函数的内部定义另一个函数. 2.为什么有函数的嵌套定义: # 1)函数fn2想直接使用fn1函数的局部变量,可以讲fn2直接定义到fn1的内部,这样fn2就可以直接访问fn ...
- day12 装饰器进阶
day12 装饰器进阶 #装饰器进阶 #functools.wraps #带参数的装饰器 #多个装饰器装饰用一个函数 def outer(*args,**kwargs):#接收的时候是聚合(成元祖的形 ...
最新文章
- ubuntu下 mysql数据 自执行备份
- C# Winform编程ListBox之添加图标
- Lucene 的四大索引查询 ——bool 域搜索 通配符 范围搜索
- html两个框架同时_两个框架的故事
- html列表滑动字母索引,js实现做通讯录的索引滑动显示效果和滑动显示锚点效果...
- HWM和delete,drop,truncate的关系
- angular cli_使用Angular CLI连接到服务器的最佳方法
- 【扯皮】李诞 ▪《笑场》
- 服务器的系统搭建,服务器系统搭建
- kotlin t class.java_尝试Java,从入门到Kotlin(下)
- Verilog实现的多个按键消抖(具体模块可用)
- @media实现网页自适应中的几个关键分辨率
- 算法设计与分析第二版第一章笔记
- 哈理工OJ 1562 字符统计器(水模拟)
- 解密SuperWebview的一种另类方法
- 【机器学习】十二、一文看懂支持向量机原理
- JAVA计算机毕业设计网上图书销售系统(附源码、数据库)
- 关于schema文档
- 分布式存储系统——《Neo4j》
- Poj 2965 The Pilots Brothers‘ refrigerator
热门文章
- java中JAO,Java
- python自带静态web服务器搭建代码实现(一)
- 如何把webp压缩大小?在线webp压缩的工具推荐
- 宝塔linux面板负载状态过高,宝塔Linux面板负载状态CPU100%怎么解决
- 图解组策略配置禁止修改IE主页
- 机械革命无法使用U盘启动linux,机械革命bios设置,教您机械革命bios怎么设置u盘启动...
- mysql事务锁死_mysql事务里锁死
- WebApp简单制作
- Clickhouse Kafka Engin参数记录
- 汽车材料QC/T 944-2013ELV中多溴联苯(PBBs)和多溴二苯醚(PBDEs)的检测