1. spring 简单介绍

https://spring.io

什么事 SSM?

spring-mvc

spring-framework -- web服务层

mybatis --数据持久化

2. IOC/DI --控制反转--是啥

控制反转 Inversion of Control

依赖注入 DI dependency inject

创建对象的权利或者决定位置 转移到 spring,由spring容器来创建对象

演变:

举个例子:

对所有商品打打5折

查出所有的商品 将价格打五折 保存

再次演变 接口以及实现

业务接口没变但是 实现由多种形式 可以根据需要切换到不同的实现

同样的举个例子:

对所有商品打打5折

直接一条sql就能实现 不用查找再更新

接着演进 创建对象也由spring来完成



原理的同属理解:

根据xml配置文件创建对象

将对象放入容器 (map)

根据需要 通过名字 获取对象

3. 实现

package com.msb.pojo;

/**
* @Auther: jack.chen
* @Date: 2023/11/12 - 11 - 12 - 15:46
* @Description: com.msb.pojo
* @version: 1.0
*/
public class Book {
private int id;
String name;
String author;
double price; public Book() {
} public Book(int id, String name, String author, double price) {
this.id = id;
this.name = name;
this.author = author;
this.price = price;
} public int getId() {
return id;
} public void setId(int id) {
this.id = id;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getAuthor() {
return author;
} public void setAuthor(String author) {
this.author = author;
} public double getPrice() {
return price;
} public void setPrice(double price) {
this.price = price;
} @Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
}
<?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
https://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="b" class="com.msb.pojo.Book" ></bean> </beans>
public class Test01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Book b = (Book)context.getBean("b");
System.out.println(b); }
}

上面的实现确实能实例化一个Book对象

但是如何传参 实例化对象?

  1. 使用setter方法
  2. 使用构造器

    <bean id="b" class="com.msb.pojo.Book" >
<property name="id" value="4"></property>
<property name="name" value="水浒传"></property>
<property name="author" value="施耐庵"></property>
<property name="price" value="39.98"></property>
</bean>

说明:这里通过setter的方式来设置属性 name="xxx" 实际上是调用setterxxxx方法来实现

    <bean id="b2" class="com.msb.pojo.Book" >
<constructor-arg name="id" value="5"></constructor-arg>
<constructor-arg name="name" value="时间简史"></constructor-arg>
<constructor-arg name="author" value="霍金"></constructor-arg>
<constructor-arg name="price" value="25.5"></constructor-arg>
</bean>

说明:这里通过调用构造器的方式来实例化对象 name=xxx 实际上是 构造器里面形参的名称

public class Test01 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Book b = (Book)context.getBean("b2");
System.out.println(b); }
}

3. 如果 对象的 属性为引用数据类型 如何 实例化对象

Girl Boy girl的boyfriend是boy

package com.msb.pojo;

/**
* @Auther: jack.chen
* @Date: 2023/11/12 - 11 - 12 - 20:42
* @Description: com.msb.pojo
* @version: 1.0
*/
public class Boy { private String name;
private int age; public Boy() {
} public Boy(String name, int age) {
this.name = name;
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "Boy{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
package com.msb.pojo;

/**
* @Auther: jack.chen
* @Date: 2023/11/12 - 11 - 12 - 20:40
* @Description: com.msb.pojo
* @version: 1.0
*/
public class Girl {
private int age;
private String name;
private Boy boyfriend; public Girl() {
} public Girl(int age, String name) {
this.age = age;
this.name = name;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Girl(int age, String name, Boy boyfriend) {
this.age = age;
this.name = name;
this.boyfriend = boyfriend;
} @Override
public String toString() {
return "Girl{" +
"age=" + age +
", name='" + name + '\'' +
", boyfriend=" + boyfriend +
'}';
}
}
public class Test02 {

    public static void main(String[] args) {
Boy boy = new Boy("小刚", 27); Girl lili = new Girl(25, "lili", boy);
System.out.println(lili);
}
}

很简单的一个例子 但是 如何用注解来实现创建对象?

    <bean id="boy1" class="com.msb.pojo.Boy">
<property name="name" value="小帅aaa"></property>
<property name="age" value="27"></property>
</bean> <bean id="girl1" class="com.msb.pojo.Girl">
<property name="age" value="25"></property>
<property name="name" value="小美1"></property>
<property name="boyfriend" ref="boy1"></property>
</bean>
    public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Girl girl1 = (Girl)context.getBean("girl1");
System.out.println(girl1);
}

4 如何用注解的方式 以少量的代码实现对象的创建于获取

复习一下 什么是注解

定义扫描的位置:

<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
https://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
https://www.springframework.org/schema/context/spring-context.xsd"> <context:component-scan base-package="com.msb.pojo"></context:component-scan>
</beans>

public class Test03 {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Girl girl1 = (Girl)context.getBean("girl");
System.out.println(girl1);
}
}



其他的注解 不同之处 是使用的层 不同 加以区分 @Component 不区分层

@value 实力化对象将基本数据类型的属性注入 不易依赖setter方法

@Autoaired 将引用数据类型的属性设置

@Component
public class Boy {
@Value("小帅11111")
private String name;
@Value("18")
private int age; public Boy() {
}
@Component
public class Girl {
@Value("18")
private int age; @Value("xiaomei111")
private String name; @Autowired
private Boy boyfriend; public Girl() {
}
    public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
Girl girl1 = (Girl)context.getBean("girl");
System.out.println(girl1);
}

java项目实战-spring-基本用法01-day24的更多相关文章

  1. selenium+java项目实战---百度输入框

    最近对java+selenium+testng+maven 做一个小项目的总结,并对工作中的框架在做一些小总结,大概目录为: 1.项目实战--百度登录输入框 2.项目的二次封装 3.框架分层,及po模 ...

  2. Java高级项目实战之CRM系统01:CRM系统概念和分类、企业项目开发流程

    1. CRM系统介绍 CRM系统即客户关系管理系统, 顾名思义就是管理公司与客户之间的关系. 是一种以"客户关系一对一理论"为基础,旨在改善企业与客户之间关系的新型管理机制.客户关 ...

  3. Android项目实战手机安全卫士(01)

    目录 项目结构图 源代码 运行结果 项目结构图 源代码 SplashActivity.java package com.coderdream.mobilesafe.activity; import a ...

  4. 【java项目实战】一步步教你使用MyEclipse搭建java Web项目开发环境(一)

    首先.在開始搭建MyEclipse的开发环境之前.还有三步工具的安装须要完毕,仅仅要在安装配置成功之后才干够进入以下的java Web项目开发环境的搭建. 1.安装工具 第一步,下载并安装JDK,到官 ...

  5. 【java项目实战】dom4j解析xml文件,连接Oracle数据库

    简单介绍 dom4j是由dom4j.org出品的一个开源XML解析包.这句话太官方.我们还是看一下官方给出的解释.例如以下图: dom4j是一个易于使用的.开源的,用于解析XML,XPath和XSLT ...

  6. 【java项目实战】代理模式(Proxy Pattern),静态代理 VS 动态代理

    这篇博文,我们主要以类图和代码的形式来对照学习一下静态代理和动态代理.重点解析各自的优缺点. 定义 代理模式(Proxy Pattern)是对象的结构型模式,代理模式给某一个对象提供了一个代理对象,并 ...

  7. 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

    线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. ...

  8. 【Java项目实战】——DRP之HTML总结

    在DRP的学习之中,又将之前BS的内容又一次复习了一遍,借着复习的机会将BS的各个部分再又一次总结一下.今天来总结一下HTML. 在学习BS之后就进入了权限系统的开发之中,可是仍然发现非常多代码不会不 ...

  9. Java后端框架之Spring Boot详解,文末有Java分布式实战项目视频可取

    在 Java 后端框架繁荣的今天,Spring 框架无疑是最最火热,也是必不可少的开源框架,更是稳坐 Java 后端框架的龙头老大. 用过 Spring 框架的都知道 Spring 能流行是因为它的两 ...

  10. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

随机推荐

  1. Educational Codeforces Round 26 Problem A

    A. Text Volume time limit per test 1 second memory limit per test 256 megabytes input standard input ...

  2. Windows Server2016 默认使用英文输入法或默认使用中文输入法

    1.确认是Server2016操作系统及以后版本 2.打开开始菜单"设置"--"时间和语言" 3.添加英文输入法(已存在可以跳过) 找到"区域与语言& ...

  3. 当创建一个ingress后,kubernetes会发什么?

    本文分享自华为云社区<当创建一个ingress后,kubernetes会发什么?>,作者:可以交个朋友. 一.Ingress概述 Ingress是一组路由转发规则合集,将集群内部服务通过7 ...

  4. Unix 文件权限位

    简介 在 Unix 或者类 Unix 文件系统中,每个文件(或者目录,目录也被视为文件)都有自己的所属对象和一个与之相关的 Unix 用户组关联,可以通过设置对应的文件的权限标记指定对于所属用户.所属 ...

  5. Kafka 万字精讲|工作五年这些你都知道吗?

    目录 前言 一.Kafka 简介 1.1 事件流平台 1.2 Kafka 主要概念和术语 1.3 Zookeeper 二.Kafka 集群搭建和使用 2.1 使用 Docker Compose 搭建 ...

  6. 昇腾CANN 7.0 黑科技:大模型训练性能优化之道

    本文分享自华为云社区<昇腾CANN 7.0 黑科技:大模型训练性能优化之道>,作者: 昇腾CANN . 目前,大模型凭借超强的学习能力,已经在搜索.推荐.智能交互.AIGC.生产流程变革. ...

  7. GaussDB(for Redis)新特性发布:前缀搜索千倍提升与集群版多租隔离

    摘要:GaussDB(for Redis)推出的全新特性,实现集群版多租隔离功能和增强版前缀搜索,前缀搜索时延较开源Redis降低千倍,为助力企业业务发展带来了更多可能. 近期,华为云GaussDB( ...

  8. 云图说 | 华为云医疗智能体EIHealth,AI赋能基因组研究

    摘要: 华为云医疗智能体面为基因组研究,提供高性能.高可靠性.高性价比的基因测序计算.存储和AI能力. 本文分享自华为云社区<​​​​​​​​​​​​​​[云图说]第230期 医疗智能体:AI赋 ...

  9. 一文搞定Matplotlib 各个示例丨建议收藏

    摘要:Matplotlib 是 Python 的绘图库. 它可与 NumPy 一起使用 ,Matplotlib也是深度学习的常用绘图库,主要是将训练的成果进行图形化,因为这样更直观,更方便发现训练中的 ...

  10. Kubernetes(K8S) Controller - StatefulSet、DaemonSet 介绍

    无状态和有状态 无状态 Deployment 认为Pod 都是一样的.javademo1-6fb64c4664-dj4dh.javademo1-6fb64c4664-dj54s 它们的内容是一样的. ...