https://www.yuque.com/dujubin/ltckqu/kipzgd#,注意的是,现在(202401)SpringFramework从release搬到了snapshot下,在这下面找到6.0.2下载.
下载后解压到文件夹,整个框架包含非常多jar包。
然后就可以在pom文件中写入依赖,声明需要的用的jar包。
如果只需要最基本IoC、DI支持,则只需要context包,而context包依赖于其他包,如果采用maven,只要导入context一条依赖即可。
新建一个module,spring6-002,选好SDK版本,maven构建。
老规矩,pom文件入手
1.打包方式选择jar(学习spring不必是web项目,故jar打包即可)
2.添加6.0的spring-context依赖,添加后检查右侧maven目录,会发现自动导入了aop,core,bean等下级依赖.
<packaging>jar</packaging>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>6.0.2</version>
</dependency>S
引入单元测试junit依赖…每次引入的依赖.如果之前已经引用过远程仓库,则已经下载到了本地仓库,此时自己打就会有提示,否则就要从远程仓库查询
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
3.与mybatis一致,spring也需要在类的根目录路径下(resources)写一个配置文件,创建方式如下.起名为spring.xml4.编写代码,结构如下图
src\main\java\com\sunsplanter\spring6\dao\UserDaoImplForMySQL
package com.sunsplanter.spring6.dao;
//快速测试第一个程序,就不写接口了
public class UserDaoImplForMySQL {
}
src\main\resources\spring.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是唯一的,与mybatis的配置文件非常相似
class属性声明要管理哪个类中的对象,路径必须完整包含包名-->
<!-- 注意,bean标签不是成对的<bean></bean>-->
<bean id="userDaoBean" class="com.sunsplanter.spring6.dao.UserDaoImplForMySQL"/>
</beans>
src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
package com.sunsplanter.spring6.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FirstSpringTest {
@Test
public void testFirstTest(){
//1.与mybatis思想也很相似,写好了容器的配置规格和管理对象(spring.xml),下一步就是想办法制造(获取)出一个容器,用这个容器创建和管理对象
//ClassPathXmlApplicationContext的参数为spring配置文件的地址
//applicationContext就是一个spring容器的对象实例,ApplicationContext是一个接口,其有很多实现类,ClassPathXmlApplicationContext就是其中之一
// ClassPathXmlApplicationContext专门从类的跟路径中加载spring配置文件,因此配置文件只要放在resources下就可以不写全路径
// 默认情况下Spring会通过反射机制,调用类的无参构造方法实例化对象,执行完new读取了配置文件后,对象就已经创建完成
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
// 2.上句代码执行完成后对象已经创建存在了,getBean是根据bean的id,从spring容器获取要控制的对象
Object userBean = applicationContext.getBean("userDaoBean");
System.out.println(userBean);
}
}
执行test方法,可以正确输出spring帮忙创建并管理的对象(bean).
几个问题
1.Spring创建好的对象如何存储?
2.Spring配置文件的名字是任意的.
3.Spring配置文件的数量的任意的,只要名字不重复即可,最终都可通过
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
选择加载的配置文件.
4.配置文件中的类并不一定要自定义类,即使是JDK中的类也可以,只要确保有无参构造方法即可.
测试3和4
resources下新建一个Spring配置文件,命名为Date.xml
<bean id="dateBean" class="java.util.Date"/>
src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
package com.sunsplanter.spring6.test;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class FirstSpringTest {
@Test
public void testFirstTest() {
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Object dateBean = applicationContext.getBean("dateBean");
System.out.println(dateBean);
}
}
此时因为是直接调用Spring创建一个JDK自身的类,因此在src/main/java/com/sunsplanter/spring6目录下,无需声明一个实体类.直接运testFirstTest即可.可以得到输出:
**5.一个现实以及很重要的问题:**对于上例中的,假如增加了一个方法(事实上实现类肯定有各种各样的方法)
src\main\java\com\sunsplanter\spring6\dao\UserDaoImplForMySQL
package com.sunsplanter.spring6.dao;
//快速测试第一个程序,就不写接口了
public class UserDaoImplForMySQL {
public void insert(){
System.out.println(1);
}
}
再看:原本有一个类(不写接口,简单程序),且原本要在上层类中new出下层类的实例
//这是表现层中实现类中的代码,可以看出,表现层调用了控制层的类去new出对象,返回了具体类型的对象,既 人 张三 = new 人
private Userservice userService = new UserServiceImp();
//既然返回的是举行类型的对象,就可以调用该抽象类中定义的方法
userservice.insert();
但为了OCP,IoC,DIP等原则,new出实例对象全部交给了Spring容器,然而,以上章为例
//然而若用了Spring,通过获取配置文件制造一个容器(applicationContext)-通过容器调用getBean获取一个Object类型的UserDaoImplForMySQL对象
//该对象名为userBean.此时,由于该对象是Object类型的,它无法自己对应抽象类的方法
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");
Object userBean = applicationContext.getBean("userDaoBean");
userBean.insert();//错误
//将getBean方法多设置一个参数,指明返回具体类型的对象
UserDaoImplForMySQL userDaoImplForMySQL = applicationContext.getBean("userDaoBean", UserDaoImplForMySQL.class);
userDaoImplForMySQL.insert();//执行成功
启用Log4j2日志(Spring集成了Log4j2)
第一步:引入Log4j2的依赖
<!--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>
第三步:使用日志框架
src/test/java/com/sunsplanter/spring6/test/FirstSpringTest.java
Logger logger = LoggerFactory.getLogger(FirstSpringTest.class);
logger.info("我是一条日志消息");
logger.debug("de");
logger.error("er");
注意的是,JDK本身提供了Logger类,使用时一定要先添加依赖-更新maven-手打选择org.slf4j的定义的Logger,直接复制会爆红.