spring6 jsp(Spring6)
Spring6
Spring项目的创建
打开IDEA ,新建一个maven项目
在maven项目中引入spring的仓库和依赖
<repositories> <repository> <id>repository.spring.milestone</id> <name>Spring Milestone Repository</name> <url>https://repo.spring.io/milestone</url> </repository> </repositories> <dependencies> <!--spring6--> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>6.0.3</version> </dependency> </dependencies>编写Spring配置文件 。
maven成功引入Spring之后 ,在resource目录下新建一个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"> <!-- spring 配置文件 ,名字任意 ,最好放在根目录下 ,方便后期移植--> </beans>配置bean
在Java目录下新建一个类 ,在Spring6配置文件中配置bean <!-- 配置bean ,这样spring才能帮助我们管理这个对象--> <!-- bean标签有两个重要的属性 ,--> <!-- --id 是bean的唯一标志 ,不能重复--> <!-- --class 必须是全路径 ,全限定类名(带包名的类名)--> <bean id="studentBean" class="com.winter.spring6.bean.studentBean"/>编写测试程序
引入junit依赖 编写测试程序 package com.winter.spring6.test; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; /** * @author Winter * @version 1.0 * @since 1.0 */ public class FirstSrpingTest { @Test public void testFristSpringCode(){ // 第一步 获取spring容器对象 // ApplicationContext 翻译为应用上下文 ,其实就是spring容器 // ApplicationContext是一个接口,该接口下有很多实现类 ,其中一个就是ClassPathXmlApplicationContext // ClassPathXmlApplicationContext是专门从类路径加载spring配置文件的上下文对象 ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml"); // 第二步 根据bean的id从这个spring容器中获取这个对象 Object studentBean = context.getBean("studentBean"); System.out.println(studentBean); } }控制台输出:
com.winter.spring6.bean.studentBean@158d2680表示第一个Spring程序完成 ,Spring成功创建了一个student对象
第一个Spring程序的一些小细节
bean标签的id属性不可以重复
底层是怎样创建对象的?
默认情况下Spring会通过反射机制,调用类的无参数构造方法来实例化对象
Class clazz = Class.forName("com.winter.spring6.bean.student") Object obj = clazz.newInstance();要想让Spring帮你创建对象 ,那么就必须保证有无参数构造方法。
创建好的对象都存放在什么样的数据结构中?
Map<String , Object>Spring的配置文件名称不是固定的 ,想写啥写啥,但是要和下面代码中填入的字符串一致
ApplicationContext context = new ClassPathXmlApplicationContext("Spring.xml");Spring的配置文件可以有多个
ApplicationContext context = new ClassPathXmlApplicationContext("Spring1.xml","Spring2.xml");配置文件中配置的类不一定是自定义的 ,也可以是JDK中的类
<bean id="dataBean" class="java.util.Date"/>getBean() 方法调用时 ,如果指定的id不存在时 ,不会返回null而是会报错 。
getBean() 方法返回的类型时Object ,如果访问子类特有属性和方法时 ,使用时必须向下转型
或者是在getBean() 方法传入第二个参数 ,XXXX.class(指定要返回的类型)
User user = ApplicationContext.getBean("userBean",User.class);如果是从绝对路径调用spring配置文件 ,那么就需要
ApplicationContext context = new FileSystemXmlApplicationContext("D:/Spring1.xml");查阅源码可知 ,ApplicationContext有一个父接口是ListableBeanFactory ,ListableBeanFactory的父接口是BeanFactory
BeanFactory是Ioc容器的顶级接口
Spring的IoC容器底层实际上使用了工厂模式 。Spring底层的IoC是通过 XML解析+工厂模式+反射机制
实例化对象的时机:当以下代码执行时就会实例化对象
new ClassPathXmlApplicationContext("spring6.xml");启用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配置文件(文件名固定为log4j2.xml,文件必须被放到类根路径下) <?xml version="1.0" encoding="UTF-8"?> <configeration> <loggers> <!-- level指定日志级别 ,从低到高的优先级: ALL < TRACE < DEBUG < 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} [%t] %-3levle %logger{1024} -%msg%n"/> </console> </appenders> </configeration> 第三步:使用日志框架 Logger logger = LoggerFactory.getLogger(FirstSpringtest.class);//在哪个类里面就传什么参数 loggee.info("输入你想记录日志的内容")依赖注入
构造注入
通过调用构造方法来给属性赋值 ,在bean标签里面添加constructor-arg标签
<!-- 构造注入 通过index指定参数 --> <!-- index 属性指定参数下标,第一个参数下标是0 ref 属性用于指定注入bean的id --> <constructor-arg index="0" ref="userDaoBean"/> <!-- 构造注入 通过name指定参数 --> <!-- name属性是参数的名字 --> <constructor-arg name ref="userDaoBean"/> <!-- 构造注入 spring自己做类型匹配 --> <!-- 不指定下标也不指定参数名 --> <constructor-arg name ref="userDaoBean"/>set注入
set注入的话 ,必须提供一个set方法 ,spring会调用这个set方法,来给userDao赋值 。
想要让spring调用对应的set方法 ,需要配置property标签
<!-- set注入 需要配置property标签 --> <!-- name属性是 set方法的方法名 ,去掉set ,然后首字母变成小写 Eg: setAbcd()-----abcd ref 属性用于指定注入bean的id --> <!-- set方法起名最好是按照规范 ,一般借助IDEA自动生成 --> <proprety name="xxxx" ref="userDaoBean"/>set注入专题
注入外部Bean
之前的几个例子就是外部注入:
外部bean的特点:bean定义在外面 ,然后在property标签中通过ref属性引入
注入内部Bean
在Bean标签中嵌套bean标签
<bean id="studentBean" class="com.winter.spring6.bean.studentBean"> <property name="userDao"> <bean class="com.winter.spring6.bean.userBean"/> </property> </bean>注入简单类型
在property标签中 使用value属性给简单类型赋值
<!-- value 属性用于给简单类型赋值 --> <proprety name="xxxx" value="123"/>什么是简单类型?
使用IDEA查找Beanutils类 ,然后找到isSimpleValueType方法 ,查看里面的代码可知
基本类型 包装类 枚举类 字符串类型 数字 日期Date 时间 、时区Temporal URI 、URL 语言local Class简单类型的应用:让spring去管理数据源
创心域SEO版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!