Spring()

编程入门 行业动态 更新时间:2024-10-19 17:18:39

<a href=https://www.elefans.com/category/jswz/34/1769862.html style=Spring()"/>

Spring()

一、导学

二、

1.入门程序

spring快照版本是最新的版本,未发布。需要用到<repository></>

下面这个不需要配置仓库,直接写在依赖中就行

引入spring相关依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns=".0.0"xmlns:xsi=""xsi:schemaLocation=".0.0 .0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.grin</groupId><artifactId>spring-002-first</artifactId><version>1.0-SNAPSHOT</version><!-- 打包方式  --><packaging>jar</packaging><properties><mavenpiler.source>17</mavenpiler.source><mavenpiler.target>17</mavenpiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.10</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>
</project>

疑惑:

1.类加载路径

类路径classpath指的是编译后路径即:
本项目[或模块目录]/target/[项目或模块名]/WEB-INF/classes

原项目中java目录下的文件和recource目录下的文件页都被打包到了此类路径下。

如下图: java目录中的文件和recource目录中的文件经过编译后,都会放到WEB-INF/classes目录下:

把test写成private后,外界调用不了这个测试方法。

一个小细节:发现构造方法,不是在getBean()时创建的。

证明如下:

2.spring6启用log4j2框架

上去就报错了 

Cannot reconnect

第一步:引入依赖

<!--log4j2的依赖--><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-core</artifactId><version>2.19.0</version></dependency><dependency><groupId>org.apache.logging.log4j</groupId><artifactId>log4j-slf4j2-impl</artifactId><version>2.19.0</version></dependency>

第二步:在类的根路径下提供log4j2.xml配置文件(文件名固定为:log4j2.xml,文件必须放到类根路径下。)

<?xml version="1.0" encoding="UTF-8"?><configuration><loggers><!--level指定日志级别,从低到高的优先级:ALL < TRACE < DEBUG < INFO < WARN < ERROR < FATAL < OFF--><root level="DEBUG"><appender-ref ref="spring6log"/></root></loggers><appenders><!--输出日志信息到控制台--><console name="spring6log" target="SYSTEM_OUT"><!--控制日志输出的格式--><PatternLayout pattern="%d{yyyy-MM-dd HH:mm:ss SSS} [%t] %-3level %logger{1024} - %msg%n"/></console></appenders></configuration>

第三步:使用日志框架

Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一条日志消息");

在配置文件中,已经指定了 debug日志级别, 很有意思。当打印日志时,如果低于这个级别,则不会打印出来。

除此之外,你可以在配置文件中去指定这个级别。

三、 spring对loc(控制反转) 的实现

1.set注入。

配合property标签,

注意 name是 本类的set方法的名字:去掉set,首字母小写

ref 是所要引用 的其他类。

总之,通过 本类的set方法对所引用的类进行注入。

2.构造注入

利用 <constructor-arg  name=""  ref=" ">  ,  name属性可被 索引,类型推断 替代。 

3.内部bean和外部

没有那么复杂,声明在外面的bean叫做 外部bean,有自己的 id 和class .

                        而内部bean写在<property>中,不需要class

4.给简单类型注入

疑惑:为什么要给它注入。

下面是spring中认为的基本数据类型,不使用ref来引用,而是通过name属性。

但要注意 Date类型的注入,要满足它所要求的格式。

在实际开发中,不会用Date这种注入方式,应该有更好的。

经典:

注入空字符串

注入的值含有 特殊符号

第二种方案,只能用<value></value>标签

p命名空间

c命名空间

schemaLocation

验证xml文档

util命名空间

下面这两个 自动装配 是基于set方法 的        

根据名字自动装配

根据类型自动装配        

根据类型进行自动装配时,在有效的配置文件当中,某种类型的实例只能有一个

引入外部属性配置文件,context命名空间

当加载时,会默认先加载windows中的环境变量,因此要在properties文件中的key前 加上 jdbc前缀

下面是引入步骤:

我们都知道编写数据源的时候是需要连接数据库的信息的,例如:driver url username password等信息。这些信息可以单独写到一个属性配置文件中吗,这样用户修改起来会更加的方便。当然可以。

创建实现数据源的类

引入配置文件,并可以用${}进行根据key取值

四、bean作用域

单例和多例(singleton  ans  protope)

自定义scope, 同一个线程有一个bean

五、GoF之工厂模式

简单工厂模式(静态 工厂方法模式

简单工厂模式是工厂方法模式的一种特殊实现。

工厂方法模式

解决了 简单工厂模式违背 ocp的原则

抽象工厂模式

五、bean的获取方式

1.通过构造方法实例化(利用无参构造)

在spring配置文件中直接配置类路径,spring会自动调用该类的无参构造方法。

2.通过简单工厂模式(静态工厂方法模式)

底层还是new() 创建一个对象

3.通过工厂方法模式

4.实现 接口(惊讶)

接口里可以有默认方法。

这是对第3中方式的优化:spring提供了一个抽象工厂的接口,我们只要去实现这个接口,就创建出了具体的工厂 ,我们通过这个具体的工厂来创建bean.

备注:我们这个具体的工厂 也是一个bean,因为它是通过构造方法创建出来的,是一个特殊的bean,可以去创建普通的bean

通过Factory工厂bean 主要是对普通bean进行加工处理

beanFactory和FactoryBean  的区别

注入自定义Date

六、bean的生命周期

五步法

1.创建bean

2.属性赋值(即注入)

3.初始化bean ,init方法自己写,自己配,方法名随意

第五步,销毁bean,自己写,自己配,方法名随意

在配置文件中指定 初始化方法和销毁方法。

必须手动关闭spring容器,就是ApplicationContext接口 实现类的close()方法,记得强转一下类型(转成实现类的类型),因为接口没有这个方法。调用close()后,会自动调用 bean指定的销毁方法

七步法

在bean初始化,加上 之前,之后这两步

bean后处理器 只作用当前作用域的所有bean

bean后处理器也需要在spring配置文件中注册

十步法

新加的3个点位,看是否实现其对应的特定接口,在这三个点位都会去检查bean是否实现了某个接口,则spring容器会调用这个接口中的方法

before之前

before之后

销毁bean之前或者说使用bean之后

点位3实现一系列接口,会有相应的方法。

bean的作用域不同,那么生命周期也不同

多例 ,spring容器只管理一部分生命周期,当客户端得到bean后,容器就不再管理该bean 

自己new的对象怎样交给spring容器管理

七、Bean的循环依赖问题

1.什么是循环依赖

A对象中有B属性。B对象中有A属性。这就是循环依赖。我依赖你,你也依赖我。

曝光

只有bean的scope为singleton 才会进行曝光 , 

多例  + 多例 +set注入 

多例 +单例 + set注入

单例+构造注入

构造注入的时候需要赋值。

参考资料:

【文字+图示】Java项目中类路径classpath具体指的是哪个路径_超周到的程序员的博客-CSDN博客

更多推荐

Spring()

本文发布于:2023-12-07 12:10:24,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1671172.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:Spring

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!