0x00前言

spring框架应用的是ioc模式,ioc模式是指控制反转模式,本质是你不去创建对象让spring框架给你创建对象你去使用对象。多种开发模式通过配置文件和注解的方式去开发的都很值得去学习

0x01基础使用

构造一个接口

public interface userdo {
void select();
}
package spring;

public class mssqldaodimpl implements userdo{

    @Override
public void select() {
System.out.println("mssqlselect");
}
}
public class mysqldaoimpl implements userdo{

    @Override
public void select() {
System.out.println("mysqldaoimp");
}
}

如果按照平时开发的思路这个时候会去写一个test类去创建mssqldaodimpl、mysqldaoimpl去构建对象然后去执行两个的select方法

如果是在spring里面就会用ioc这种方式,这两个类都是ioc容器里面的两个bean只需要通过spring的模式去访问他们

先写配置文件

<?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">
<bean id="mysqldaoimpl" class="spring.mysqldaoimpl"/>
<bean id="mssqldaoimpl" class="spring.mssqldaodimpl"/> </beans>

id是你用来寻找bean的名字,后面是更上的类

测试类

package spring;
import spring.userdo;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext; public class test {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
userdo mysqldoimpl = (userdo) context.getBean("mssqldaoimpl");
userdo mysqldaoimpl = (userdo) context.getBean("mysqldaoimpl");
mysqldaoimpl.select();
mysqldoimpl.select();
}
}

依赖注入

bean对象是被ioc容器所创造的,bean对象里面的属性也可以由ioc容器来构造

构造注入

构造注入:顾名思义,就是使用类中的构造函数,给成员变量赋值。注意,赋值的操作不是我们自己做的,而是通过配置

的方式,让 spring 框架来为我们注入参数

先构造一个实体类

package spring;

import java.util.Date;

public class People {
private String name;
private Integer age; public Date getDate() {
return date;
} public void setDate(Date date) {
this.date = date;
} private Date date;
public People(){ } @Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
", date=" + date +
'}';
} public People(String name, Integer age, Date date) {
this.name = name;
this.age = age;
this.date=date;
} public Integer getAge() {
return age;
} public void setAge(Integer age) {
this.age = age;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

配置文件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">
<bean id="mysqldaoimpl" class="spring.mysqldaoimpl"/>
<bean id="mssqldaoimpl" class="spring.mssqldaodimpl"/>
<bean id="People" class="spring.People">
<constructor-arg name="name" value="xiaohu"/>
<constructor-arg name="age" value="12"/>
<constructor-arg name="date" ref="now"/>
</bean>
<bean id="People2" class="spring.People">
<property name="date" ref="now"></property>
</bean>
<bean id="now" class="java.util.Date"/> </beans>

Set注入

    <bean id="People" class="spring.People">
<constructor-arg name="name" value="xiaohu"/>//值可以直接通过value来赋值
<constructor-arg name="age" value="12"/>
<constructor-arg name="date" ref="now"/>//如果值是一个类可以用ref加一个新的bean对象来完成
</bean>
<bean id="now" class="java.util.Date"/>
name:找的是类中 set 方法后面的部分
ref:给属性赋值是其他 bean 类型的
value:给属性赋值是基本数据类型和 string 类型的
实际开发中,此种方式用的较多。

Bean标签的作用

作用:

用于配置对象让 spring 来创建的。

默认情况下它调用的是类中的无参构造函数。如果没有无参构造函数则不能创建成功。

属性:
id: 给对象在容器中提供一个唯一标识。用于获取对象。
class: 指定类的全限定类名。用于反射创建对象。默认情况下调用无参构造函数。
value: 用constructor-arg指定实例对象的具体属性。
*scope: 指定对象的作用范围。
* singleton :默认值,单例的.
* prototype :多例的.
* request :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 request 域中.
* session :WEB 项目中,Spring 创建一个 Bean 的对象,将对象存入到 session 域中.
* global session :WEB 项目中,应用在 Portlet 环境.如果没有 Portlet 环境那么
*globalSession 相当于 session.
*init-method: 指定类中的初始化方法名称。
*destroy-method: 指定类中销毁方法名称。

constructor-arg标签

index:指定参数在构造函数参数列表的索引位置

type:指定参数在构造函数中的数据类型

name:指定参数在构造函数中的名称 

value:它能赋的值是基本数据类型和 String 类型

ref:它能赋的值是其他 bean 类型,也就是说,必须得是在配置文件中配置过的 bean

自动装配

在spring框架里面可以自动装配Bean。我们只需要在bean标签里面加上 autowire就可以了。

autowire属性:

先看源码:

per类

package spring.auto_bean;

public class per {
private String name;
private Dog dog;
private Cat cat; public per(String name, Dog dog, Cat cat) {
this.name = name;
this.dog = dog;
this.cat = cat;
} public per() { } public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public Dog getDog() {
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
} public Cat getCat() {
return cat;
} public void setCat(Cat cat) {
this.cat = cat;
} @Override
public String toString() {
return "per{" +
"name='" + name + '\'' +
", dog=" + dog +
", cat=" + cat +
'}';
}
}

dog和cat类

package spring.auto_bean;

public class Dog {
public void method(){
System.out.println("dog");
}
}

看一下怎么配置自动装配的

<?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">
<bean id="per" class="spring.auto_bean.per" autowire="byType">
<property name="name" value="xiaoming"/>
</bean>
<bean id="cat" class="spring.auto_bean.Cat"/>
<bean id="dog" class="spring.auto_bean.Dog"/> </beans>

看一下标签内容

no :缺省情况下,自动配置是通过“ref”属性手动设定

byName:根据属性名称自动装配。如果一个bean的名称和其他bean属性的名称是一样的,将会自装配它。

byType:按数据类型自动装配。如果一个bean的数据类型是用其它bean属性的数据类型,兼容并自动装配它。

constructor:在构造函数参数的byType方式。

autodetect:如果找到默认的构造函数,使用"自动装配用构造"否则,使用“按类型自动装配

简单理解一下这个标签如果我此时配置文件是,我选用的是通过名字自动装配,我在per类里面写的是小写的cat

在这里的bean id写的是大写的,他输出的结果是:per{name='xiaoming', dog=spring.auto_bean.Dog@4a94ee4, cat=null},cat为空没有装配到

<?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">
<bean id="per" class="spring.auto_bean.per" autowire="byName">
<property name="name" value="xiaoming"/>
</bean>
<bean id="Cat" class="spring.auto_bean.Cat"/>
<bean id="dog" class="spring.auto_bean.Dog"/> </beans>

如果我使用byType结果是:per{name='xiaoming', dog=spring.auto_bean.Dog@6d763516, cat=spring.auto_bean.Cat@52bf72b5}

Cat被识别到因为用的是class去识别的

集合注入

直接通过配置文件的方式完成

<?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">
<!-- 还是采用set注入-->
<bean id="arrlist" class="spring.auto_bean.per">
<property name="cat">
<array>
<value>100</value>
<value>100</value>
</array> </property>
</bean>
<bean id="map" class="spring.auto_bean.per">
<property name="name">
<map><entry key="name" value="HELLO"></entry> </map>
</property>
</bean> </beans>

各种数据类型对应不同的格式,只需要简单的了解一下就OK

注解自动装配

如果使用注解自动装载bean的话,我们需要对xml进行一个配置,加上context:annotation-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"
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">
<context:annotation-config/>
<bean id="cat" class="spring.auto_bean.Cat"/>
<bean id="dog" class="spring.auto_bean.Cat"/>
<bean id="person" class="spring.auto_bean.per">
<property name="name" value="xiaoming"/>
</bean>
</beans>

然后在类上面写上注解标签@Autowired

0x02注解开发配置

0x1容器

容器获取方式1:通过了路径活得xml配置文件

ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean2.xml");

配置方式2:通过文件路径获取配置文件

 ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("D://bean2.xml");
BeanFactory是IOC顶层的接口,初始化BeanFactory对象时,加载bean延迟加载
AppLicationContext接口是Spring容器的核心接口,初始化Bean的时候立即加载
ApplicationContext常用的初始化分类
常用的类:ClassPathXmlApplicationContext
FileSystemApplicationContext

0x2注解开发自定义bean

先写一个主类

package spring.editbean;

import org.springframework.stereotype.Component;

@Component("Animal")
public class Anmial {
private chicken chicken;
private duke duke; public spring.editbean.chicken getChicken() {
return chicken;
} public void setChicken(spring.editbean.chicken chicken) {
this.chicken = chicken;
} public spring.editbean.duke getDuke() {
return duke;
} public void setDuke(spring.editbean.duke duke) {
this.duke = duke;
} public Anmial(spring.editbean.chicken chicken, spring.editbean.duke duke) {
this.chicken = chicken;
this.duke = duke;
} @Override
public String toString() {
return "Anmial{" +
"chicken=" + chicken +
", duke=" + duke +
'}';
}
}

和两个分类

package spring.editbean;

import org.springframework.stereotype.Component;

@Component("duke")
public class duke {
public void method(){
System.out.println("duke被执行了");
} public duke() {
System.out.println("duke的构造函数被执行了");
}
}

在你需要自定义的类上面加上@Component("duke"):意思就是定义一个组件然后给他的名字是,然后在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"
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">
<context:component-scan base-package="spring"/> </beans>

<context:component-scan base-package="spring"/>去spring包下搜索组件。

步骤:

  1. 在类上面创建注释

  2. 如果类有其他引用数据类型需要在其他引用数据类型上面也要加注释

  3. 在xml文件中配置自动搜索和搜索路径

测试代码

public class TEST {
public static void main(String[] args) {
ApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("bean5.xml");
Anmial anmial = (Anmial) classPathXmlApplicationContext.getBean("Animal");
System.out.println(anmial);
}
}
输出结果:Anmial{chicken=spring.editbean.chicken@62230c58, duke=spring.editbean.duke@2cd2a21f}+两个分类的构造函数结果。

bean注解配置的三个分支

@Controller 用于表现层的注解bean

@Service 用于业务层bean注解

@Repository 用于数据层的bean定义

0x3bean生命周期和作用范围

@Scope定义作用范围

@PostConstruct构造方法前执行

@PreDestroy销毁方法前执行

0x4纯注解开发

把配置文件改成配置类

@Configuration
@ComponentScan("spring")
@PropertySource("value.properties")
public class springconfig {
}
@Configuration确定为配置类
@ComponentScan("去扫描包,找到bean")
@PropertySource("value.properties")对value的配置文件的的配置用键值对的方式存在。

自动配置

@Component("Animal")
public class Anmial {
@Autowired
private chicken chicken;
@Autowired
private duke duke;
@Value("${name}")
private String name;
  • Value的值就是通过前面传入的文件导入的

0x5管理三方Bean

用到的方法是用写配置类的方法,然后通过Bean去构造一个bean

@Configuration
//定义一个方法去管理对象
public class mangerbean {
@Bean
public DataSource dataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setDriverClassName("com.mysql.jdbc.Drvier");
druidDataSource.setUrl("jdbc:mysql://localhost:3306/tese");
druidDataSource.setUsername("root");
druidDataSource.setPassword("zhonglin");
return druidDataSource; } }

测试方法

    @Test
public void manger(){
ApplicationContext acac = new AnnotationConfigApplicationContext(mangerbean.class);
DataSource bean = acac.getBean(DataSource.class);
System.out.println(bean);
}
}

0X03结尾

ioc模型很重要这种bean注入的形式不去自己创造对象的思路很重要,各种重要的标签可以做完为以后形成构造链分析的好帮手,同时现在也正式开始恢复正常的学习

java学习之spring基础的更多相关文章

  1. 第65节:Java后端的学习之Spring基础

    Java后端的学习之Spring基础 如果要学习spring,那么什么是框架,spring又是什么呢?学习spring中的ioc和bean,以及aop,IOC,Bean,AOP,(配置,注解,api) ...

  2. Java学习笔记之---基础语法

    Java学习笔记之---基础语法 一. Java中的命名规范 (一)包名 由多个单词组成时,所有字母小写(例如:onetwo) (二)类名和接口 由多个单词组成时,所有单词首字母大写(例如:OneTw ...

  3. Java回顾之Spring基础

    第一篇:Java回顾之I/O 第二篇:Java回顾之网络通信 第三篇:Java回顾之多线程 第四篇:Java回顾之多线程同步 第五篇:Java回顾之集合 第六篇:Java回顾之序列化 第七篇:Java ...

  4. Java学习1——计算机基础知识

    本文包含了一些计算机基础知识:计算机组成:Windows常用快捷键:DOS常用命令:计算机语言发展史.

  5. Java学习之旅基础知识篇:数据类型及流程控制

    经过开篇对Java运行机制及相关环境搭建,本篇主要讨论Java程序开发的基础知识点,我简单的梳理一下.在讲解数据类型之前,我顺便提及一下Java注释:单行注释.多行注释以及文档注释,这里重点强调文档注 ...

  6. java学习笔记之基础篇

    java选择语句之switch   //switch可以用于等值判断 switch (e) //int ,或则可以自动转化成int 的类型,(byte char short)枚举jdk 7中可以防止字 ...

  7. Java学习之旅基础知识篇:面向对象之封装、继承及多态

    Java是一种面向对象设计的高级语言,支持继承.封装和多态三大基本特征,首先我们从面向对象两大概念:类和对象(也称为实例)谈起.来看看最基本的类定义语法: /*命名规则: *类名(首字母大写,多个单词 ...

  8. Java学习之计算机基础(一)

    阅读本文大概需要 4 分钟 想要开始学习Java开发,需要掌握一些必要的计算机基础.如果你是计算机专业的人或者已经学过类似的课程,可以跳过这篇文章的阅读.计算机基础课程有很多,小编在大学里学过的课程就 ...

  9. #Java学习之路——基础阶段二(第九篇)

    我的学习阶段是跟着CZBK黑马的双源课程,学习目标以及博客是为了审查自己的学习情况,毕竟看一遍,敲一遍,和自己归纳总结一遍有着很大的区别,在此期间我会参杂Java疯狂讲义(第四版)里面的内容. 前言: ...

随机推荐

  1. PHP实现服务器文件预览

    PHP实现服务器里面的所有文件进行预览跟手机文件夹一样 服务器创建一个index.php文件 点我查看 <?php // errors ini_set('display_errors', 1); ...

  2. Linux虚拟机启动报错operating system not found解决步骤

    此报错为硬盘上的启动代码丢失 实验准备步骤 1) 准备: dd if=/dev/zero of=/dev/nvme0n1 bs=446 count=1 2) 系统启动报错截图 修复步骤如下 第一步:选 ...

  3. PostgreSQL 与 Oracle 访问分区表执行计划差异

    熟悉Oracle 的DBA都知道,Oracle 访问分区表时,对于没有提供分区条件的,也就是在无法使用分区剪枝情况下,优化器会根据全局的统计信息制定执行计划,该执行计划针对所有分区适用.在分析利弊之前 ...

  4. winform, 实现窗口程序像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是否在窗体程序上,在 ...

  5. 如何在Windows中查询证书颁发机构已颁发的证书

    有时候需要看一下证书颁发机构已经颁发出去的证书,看看某个用户或者某个计算机获取过的证书有哪些.通常可以在证书颁发机构的MMC中查看.对于测试环境或者刚开始用的CA来说,这样查看挺简单的.但是对于用了一 ...

  6. 面试突击84:Spring 有几种事务隔离级别?

    Spring 中的事务隔离级别和数据库中的事务隔离级别稍有不同,以 MySQL 为例,MySQL 的 InnoDB 引擎中的事务隔离级别有 4 种,而 Spring 中却包含了 5 种事务隔离级别. ...

  7. K8s 上的分布式存储集群搭建(Rook/ceph)

    转载自:https://mp.weixin.qq.com/s/CdLioTzU4oWI688lqYKXUQ 1 环境准备 1.1 基础环境 3台配置一致的虚拟机 虚拟机配置:4c 8g 虚拟机操作系统 ...

  8. shell下cat EOF中变量$处理

    在使用cat EOF中出现$变量通常会直接被执行,显示执行的结果.若想保持$变量不变需要使用 \ 符进行注释 [root@localhost ~]# cat >> aa.txt <& ...

  9. Portainer安装,配置自定义镜像仓库拉取镜像

    Portainer介绍 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控制台 ...

  10. 监控Redis集群--废弃,使用新教程

    prometheus监控redis需要用到redis_exporter. redis_exporter 项目地址:https://github.com/oliver006/redis_exporter ...