目录
一、Spring5概述
Spring是轻量级的开源的JavaEE框架,目的是为了解决企业应用开发的复杂性
1、Spring中有两个核心部分:IOC和Aop
- IOC:控制反转,把创建对象的过程交给Spring进行管理
- Aop:面向切面,不修改源代码进行功能增强
2、Spring特点
- 方便解耦,简化开发
- Aop编程支持
- 方便程序的测试
- 可以方便和其他框架进行整合
- 方便进行事务的操作
- 降低Java EE API开发难度
二、IOC容器
1、什么是IOC?
- 控制反转,把对象创建和对象之间的调用过程交给Spring进行管理
- 使用IOC目的:降低耦合度
2、IOC底层原理
- 使用xml解析,工厂模式,反射
3、IOC过程
- 第一步,xml配置文件,配置创建的对象
<bean id="dao" class="com.atguigu.UserDao"></bean>
- 第二步,有service类和dao类,创建工厂类
class UserFactory {
public static UserDao getDao(){
String classValue = class属性值; // 1 xml解析
Class clazz = Class.forName(classValue); // 2 通过反射创建对象
return (UserDao)clazz.newInstance();
}
}
4、IOC接口(BeanFactory)
- IOC思想基于IOC容器完成,IOC容器底层就是对象工厂
- Spring提供IOC容器两种实现方式(两个接口):
- BeanFactory:
- IOC容器的基本实现,是Spring内部的使用接口,不提供开发人员进行使用
- 加载配置文件时不会创建对象,在获取(或使用)对象时,才会创建对象
- ApplicationContext:
- BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员进行使用
- 加载配置文件时就会把配置文件中的对象创建
- BeanFactory:
5、IOC操作Bean管理
1、什么是Bean管理?
- Bean管理指的是两个操作
- Spring创建对象
- Spring注入属性
2、基于xml配置文件方式实现bean管理
- 基于xml方式创建对象
<!--配置User对象创建--> <bean id="user" class="com.atguigu.spring5.User"></bean>
在Spring配置文件中,使用bean标签,标签里面添加对应属性,就可以实现对象创建
-
在bean标签里面有很多属性,介绍常用的属性
-
id属性:唯一标识
-
class属性:类全路径(包类路径)
-
-
创建对象的时候,默认执行无参构造方法完成对象创建
-
- 基于xml方式注入属性
- DI:依赖注入,就是注入属性
- 使用set()方法注入
/** * 使用set方法进行注入 */ public class Book { // 创建属性 private String bname; private String bauthor; // 创建属性对应的set方法 public void setBname(String bname) { this.bname = bname; } public void setBauthor(String bauthor) { this.bauthor = bauthor; } }
<?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="book" class="com.atguigu.spring5.Book"> <!-- 使用property完成属性的注入 name: 类里面属性的名称 value: 向属性注入的值 --> <property name="bname" value="倚天屠龙记"></property> <property name="bauthor" value="金庸"></property> </bean> </beans>
public class TestSpring5 { @Test public void testBook1(){ ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); Book book = context.getBean("book", Book.class); book.testDemo1(); } }
- 使用有参构造方法注入
/** * 使用有参构造注入 */ public class Orders { // 创建属性 private String Oname; private String address; // 有参构造方法 public Orders(String oname, String address) { this.Oname = oname; this.address = address; } public void ordersTest(){ System.out.println(Oname + "," + address); } }
<?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="orders" class="com.atguigu.spring5.Orders"> <constructor-arg name="oname" value="Mac book Pro"></constructor-arg> <constructor-arg name="address" value="China"></constructor-arg> </bean> </beans>
public class TestSpring5 { @Test public void testOrders(){ // 加载spring配置文件 ApplicationContext context = new ClassPathXmlApplicationContext("bean1.xml"); // 获取配置创建的对象 var orders = context.getBean("orders", Orders.class); orders.ordersTest(); } }
- 使用set()方法注入
- DI:依赖注入,就是注入属性
-
xml注入其他类型属性
-
null值
<?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="book" class="com.atguigu.spring5.Book"> <!-- 使用property完成属性的注入 name: 类里面属性的名称 value: 向属性注入的值 --> <property name="bname" value="倚天屠龙记"></property> <property name="bauthor" value="金庸"></property> <!-- 将address设置null值 --> <property name="address"> <null/> </property> </bean> </beans>
-
属性值包含特殊符号
<?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="book" class="com.atguigu.spring5.Book"> <!-- 使用property完成属性的注入 name: 类里面属性的名称 value: 向属性注入的值 --> <property name="bname" value="倚天屠龙记"></property> <property name="bauthor" value="金庸"></property> <!-- 属性值包含特殊符号 1、把<>转义<> 2、把带特殊符号的内容写到CDATA中 --> <property name="address"> <value><![CDATA[<<南京>>]]></value> </property> </bean> </beans>
-
注入数组类型属性、List集合类型属性、Map集合类型属性、set集合类型属性
package com.atguigu.spring5.collectiontype; import java.util.Arrays; import java.util.List; import java.util.Map; import java.util.Set; public class Stu { // 数组类型属性 private String[] courses; // 集合类型属性 private List<String> list; // Map类型属性 private Map<String,String> maps; // set集合类型属性 private Set<String> sets; public void setCourses(String[] courses) { this.courses = courses; } public void setList(List<String> list) { this.list = list; } public void setMaps(Map<String, String> maps) { this.maps = maps; } public void setSets(Set<String> sets) { this.sets = sets; } public void out() { System.out.println(Arrays.toString(courses)); System.out.println(list); System.out.println(maps); System.out.println(sets); } }
<?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="stu" class="com.atguigu.spring5.collectiontype.Stu"> <!-- 数组类型的属性的注入 --> <property name="courses"> <array> <value>Java</value> <value>MySQL</value> <value>C#</value> </array> </property> <!-- list集合类型属性 --> <property name="list"> <list> <value>雪中悍刀行</value> <value>三体</value> </list> </property> <!-- Map集合类型属性 --> <property name="maps"> <map> <entry key="雪中悍刀行" value="烽火戏诸侯"></entry> <entry key="三体" value="刘慈欣"></entry> </map> </property> <!-- Set集合类型属性 --> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> <value>Mongodb</value> </set> </property> </bean> </beans>
package com.atguigu.spring5.testdemo; import com.atguigu.spring5.collectiontype.Stu; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestCollection { @Test public void testCollection() { ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml"); var stu = context.getBean("stu", Stu.class); stu.out(); } }
-
在集合中设置对象类型的值
<?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="stu" class="com.atguigu.spring5.collectiontype.Stu"> <!-- 数组类型的属性的注入 --> <property name="courses"> <array> <value>Java</value> <value>MySQL</value> <value>C#</value> </array> </property> <!-- list集合类型属性 --> <property name="list"> <list> <value>雪中悍刀行</value> <value>三体</value> </list> </property> <!-- Map集合类型属性 --> <property name="maps"> <map> <entry key="雪中悍刀行" value="烽火戏诸侯"></entry> <entry key="三体" value="刘慈欣"></entry> </map> </property> <!-- Set集合类型属性 --> <property name="sets"> <set> <value>MySQL</value> <value>Redis</value> <value>Mongodb</value> </set> </property> <!-- list集合类型属性,值时对象 --> <property name="courseList"> <list> <ref bean="course1"></ref> <ref bean="course2"></ref> </list> </property> </bean> <!-- 配置多个Course对象 --> <bean id="course1" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring5框架"></property> </bean> <bean id="course2" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring boot2框架"></property> </bean> </beans>
-
把集合注入的部分提取出来
package com.atguigu.spring5.collectiontype; import java.util.List; public class Book { private List<String> list; public void setList(List<String> list) { this.list = list; } public void out() { System.out.println(list); } }
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 提取list集合属性注入 --> <util:list id="bookList"> <value>三体</value> <value>雪中悍刀行</value> <value>倚天屠龙记</value> </util:list> <!-- 提取list集合属性使用 --> <bean id="book" class="com.atguigu.spring5.collectiontype.Book"> <property name="list" ref="bookList"></property> </bean> </beans>
package com.atguigu.spring5.testdemo; import com.atguigu.spring5.collectiontype.Book; import com.atguigu.spring5.collectiontype.Stu; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestCollection { @Test public void testCollectionBook() { ApplicationContext context = new ClassPathXmlApplicationContext("bean6.xml"); var book = context.getBean("book", Book.class); book.out(); } }
-
-
基于xml注入属性-外部bean
-
创建service类和dao类
-
在service中调用dao中的方法
-
在spring配置文件中进行配置
public class UserService { // 创建userDao类型属性,生成set方法 private UserDao userDao; public void setUserDao(UserDao userDao) { this.userDao = userDao; } public void add() { System.out.println("service add......"); } }
<?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"> <!-- service和dao对象进行创建 --> <bean id="userService" class="com.atguigu.spring5.service.UserService"> <!-- 注入userDao对象 name: 类里面的属性名称 ref: 创建userDao对象bean标签的id值 --> <property name="userDao" ref="userDaoImpl"></property> </bean> <bean id="userDaoImpl" class="com.atguigu.spring5.dao.UserDaoImpl"></bean> <!-- set方法注入属性 --> </beans>
-
-
基于xml注入属性-内部bean和级联赋值
<?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 --> <bean id="emp" class="com.atguigu.spring5.bean.Emp"> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!-- 对象类型的属性 --> <property name="dept"> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname"> <value><![CDATA[<<科技部>>]]></value> </property> </bean> </property> </bean> </beans>
<?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="emp" class="com.atguigu.spring5.bean.Emp"> <!-- 设置两个普通属性 --> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!-- 级联赋值 --> <property name="dept" ref="dept"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean> </beans>
<?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="emp" class="com.atguigu.spring5.bean.Emp"> <!-- 设置两个普通属性 --> <property name="ename" value="lucy"></property> <property name="gender" value="女"></property> <!-- 级联赋值 --> <property name="dept" ref="dept"></property> <!-- 需要生成dept的get方法 --> <property name="dept.dname" value="技术部"></property> </bean> <bean id="dept" class="com.atguigu.spring5.bean.Dept"> <property name="dname" value="财务部"></property> </bean> </beans>
-
FactoryBean
-
Spring有两种bean,一种普通bean,另一种工厂bean(FactoryBean)
-
普通bean:配置文件中定义的bean类型就是返回类型
-
工厂bean:配置文件中定义的bean类型可以和返回类型不一样
-
创建类,让这个类作为工厂bean,实现接口FactoryBean
-
实现接口里面的方法,在实现的方法中定义返回的bean类型
package com.atguigu.spring5.factorybean; import com.atguigu.spring5.collectiontype.Course; import org.springframework.beans.factory.FactoryBean; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MyBean implements FactoryBean<Course> { /** * 定义返回bean * @return * @throws Exception */ @Override public Course getObject() throws Exception { ApplicationContext context = new ClassPathXmlApplicationContext("bean5.xml"); var course1 = context.getBean("course1", Course.class); return course1; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } }
<?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="myBean" class="com.atguigu.spring5.factorybean.MyBean"></bean> </beans>
<?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"> <!-- 配置Course对象 --> <bean id="course1" class="com.atguigu.spring5.collectiontype.Course"> <property name="cname" value="Spring5框架"></property> </bean> </beans>
package com.atguigu.spring5.testdemo; import com.atguigu.spring5.collectiontype.Course; import com.atguigu.spring5.factorybean.MyBean; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestFactoryBean { @Test public void testFactoryBean() { ApplicationContext context = new ClassPathXmlApplicationContext("bean7.xml"); var myBean = context.getBean("myBean", Course.class); System.out.println(myBean); } }
-
-
-
bean作用域
-
在Spring中,可以设置创建bean实例是单实例还是多实例
-
在Spring中默认情况下,创建的bean是单实例对象
-
如何设置单实例还是多实例
<?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:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd"> <!-- 提取list集合属性注入 --> <util:list id="bookList"> <value>三体</value> <value>雪中悍刀行</value> <value>倚天屠龙记</value> </util:list> <!-- 提取list集合属性使用 --> <bean id="book" class="com.atguigu.spring5.collectiontype.Book" scope="prototype"> <property name="list" ref="bookList"></property> </bean> </beans>
-
在Spring配置文件中bean标签的属性(scope)用来设置单实例还是多实例
-
scope属性值
-
默认值singleton,单实例对象
-
prototype,多实例对象
-
-
singleton和prototype的区别
-
设置scope属性值为singleton的时候,加载Spring的配置文件时就会创建单实例对象;设置scope属性值为prototype的时候,在调用getBean()方法的时候才会创建对象
-
-
-
-
bean生命周期
-
生命周期:从对象创建到对象销毁的过程
-
bean生命周期(未加后置处理器)
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和对其他bean的引用(调用set方法)
-
调用bean的初始化方法(需进行配置)
-
bean可以使用了(对象获取到了)
-
当容器关闭的时候,调用bean的销毁的方法(销毁的方法需要进行配置)
-
-
演示bean的生命周期(未加后置处理器)
package com.atguigu.spring5.bean; public class Orders { private String oname; public Orders() { System.out.println("first,执行无参构造方法创建bean实例"); } public void setOname(String oname) { this.oname = oname; System.out.println("second,调用set方法设置bean实例的属性的值"); } // 创建执行的初始化方法 public void initMethod() { System.out.println("three,执行初始化的方法"); } // 创建销毁的方法 public void destroyMethod() { System.out.println("five,执行销毁的方法"); } }
<?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="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="iphone13 Pro Max"></property> </bean> </beans>
package com.atguigu.spring5.testdemo; import com.atguigu.spring5.bean.Orders; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestInitMethod { @Test public void testInitMethod() { // ApplicationContext context = new ClassPathXmlApplicationContext("bean8.xml"); ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean8.xml"); var orders = context.getBean("orders", Orders.class); System.out.println("four,获取到创建的bean实例对象"); System.out.println(orders); // 手动让bean实例销毁 context.close(); } }
-
bean生命周期(加后置处理器)
-
通过构造器创建bean实例(无参数构造)
-
为bean的属性设置值和对其他bean的引用(调用set方法)
-
把bean实例传递给bean后置处理器的方法(postProcessBeforeInitialization)
-
调用bean的初始化方法(需进行配置)
-
把bean实例传递给bean后置处理器的方法(postProcessAfterInitialization)
-
bean可以使用了(对象获取到了)
-
当容器关闭的时候,调用bean的销毁的方法(销毁的方法需要进行配置)
-
-
演示bean生命周期(加后置处理器)
package com.atguigu.spring5.bean; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanPostProcessor; import org.springframework.lang.Nullable; public class MyBeanPost implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置处理器,在初始化之前执行"); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("后置处理器,在初始化之后执行的方法"); return bean; } }
<?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="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="iphone13 Pro Max"></property> </bean> <!-- 配置后置处理器 会对当前xml配置文件中所有bean都执行此后置处理器的方法 --> <bean id="myBeanPost" class="com.atguigu.spring5.bean.MyBeanPost"></bean> </beans>
-
-
xml自动装配
-
根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
-
演示自动装配过程
package com.atguigu.spring5.autowire; public class Emp { private Dept dept; public void setDept(Dept dept) { this.dept = dept; } @Override public String toString() { return "Emp{" + "dept=" + dept + '}'; } public void out() { System.out.println(dept); } }
package com.atguigu.spring5.autowire; public class Dept { @Override public String toString() { return "Dept{}"; } }
<?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标签属性autowire,配置自动装配 autowire属性的两个值: byName:根据属性名称注入,注入bean的id值和类属性名称一样 byType:根据属性类型注入 --> <bean id="emp" class="com.atguigu.spring5.autowire.Emp" autowire="byName"> </bean> <bean id="dept" class="com.atguigu.spring5.autowire.Dept"></bean> </beans>
package com.atguigu.spring5.testdemo; import com.atguigu.spring5.autowire.Emp; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class TestAutoWire { @Test public void testAuto() { ApplicationContext context = new ClassPathXmlApplicationContext("bean9.xml"); var emp = context.getBean("emp", Emp.class); System.out.println(emp); } }
-
-
外部属性文件
-
在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="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://localhost:3306/ry-config"></property> <property name="username" value="root"></property> <property name="password" value="1133"></property> </bean> </beans>
-
引入context名称空间,使用标签引入外部属性文件
prop.driverClass=com.mysql.jdbc.Driver prop.url=jdbc:mysql://localhost:3306/ry-config prop.username=root prop.password=1133
<?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 http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 引入外部属性文件 --> <context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder> <!-- 配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="${prop.driverClass}"></property> <property name="url" value="${prop.url}"></property> <property name="username" value="${prop.username}"></property> <property name="password" value="${prop.password}"></property> </bean> </beans>
-
3、基于注解方式实现Bean管理
- 什么是注解?
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)
- 注解可以作用在类上面,方法上面,属性上面
- 使用注解的目的:简化xml配置
- Spring针对Bean管理创建对象提供了以下注解
- @Component
- @Service
- @Controller
- @Repository
- 基于注解方式实现对象创建
- 引入依赖(aop)
- 开启包扫描:配置xml文件,引入context名称空间,开启包扫描
<?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 http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 开启包扫描 一种方式,包之间使用.隔开 一种方式,扫描路径设置为包上一层 --> <context:component-scan base-package="com.atguigu"></context:component-scan> <!-- 示例1 use-default-filters="false" 表示现在不使用默认filter,使用自己配置的filter context:include-filter 设置扫描那些内容 --> <context:component-scan base-package="com.atguigu" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!-- 示例2 context:exclude-filter 设置哪些内容不进行扫描 --> <context:component-scan base-package="com.atguigu"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> </beans>
- 创建类,在类上添加创建对象注解
package com.atguigu.demo.service; import org.springframework.stereotype.Service; // 在注解中value属性值可以省略不写 // 默认值是类名称,首字母小写 @Service(value = "userService") public class UserService { public void add() { System.out.println("userService add......"); } }
-
基于注解方式实现属性注入
-
@AutoWired:根据属性类型进行自动装配
package com.atguigu.demo.service; import com.atguigu.demo.dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; // 在注解中value属性值可以省略不写 // 默认值是类名称,首字母小写 @Service public class UserService { // 定义dao类型属性 // 添加注入属性注解 @Autowired private UserDao userDao; public void add() { System.out.println("userService add......"); userDao.add(); } }
-
@Qualifier:根据属性名称进行注入(需要和@AutoWired一起使用):当一个接口有两个实现类的时候使用
-
@Resource:可以根据类型注入,可以根据名称注入
-
@Value:注入普通类型属性
-
-
纯注解开发
package com.atguigu.demo.config; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration // 作为配置类,替代xml配置文件 @ComponentScan(basePackages = {"com.atguigu"}) public class SpringConfig { }
@Test public void testServ() { ApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class); var userService = context.getBean("userService", UserService.class); System.out.println(userService); userService.add(); }
学习尚硅谷Spring5所记笔记,很适用于看完视频之后的复习