Spring5学习——打卡第一天
今日学习内容——Spring5的核心IOC
IOC容器:
(1)Inversion of control 控制反转,把对象的创建和对象的调用交给Spring进行管理。
(2)使用IOC的目的:耦合度降低。
(3)入门案例就是IOC的实现
2 、IOC底层原理
(1) xml解析、工厂模式、反射。
3 IOC(接口)
(1) IOC思想是基于IOC容器实现两种方式:(两个接口)
BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供给开发人员进行使用,加载配置文件时候不会创建对象,再获取对象(使用)才去创建。
ApplicationContext: BeanFactory接口的子接口,提供更多更强大的功能,一般由开发人员使用。加载配置文件在配置文件对象进行创建。
ApplicationContext接口有两个实现类:FileSystemXmlApplicationContex参数是对象类的绝对路径。ClassPathXmlApplicationContext参数是根目录的相对路径。
4 IOC的bean管理(创建对象和属性注入)。
(1) 基于xml配置文件方式来实现
创建对象:<bean id=”” class=”” name=””>,创建对象执行无参构造创建对象。
(2) 基于注解方式实现。(完全注解开发springboot2)
DI:依赖注入,注入属性。在创建对象的基础上。
set注入
有参构造注入
P空间注入(set注入,了解)
Xml注入其他属性
1、 字面量
Null值和特殊符号
<property name="address">
<null></null>
</property>
特殊符号<>转义或者CDATA
<property name="address">
<value><![CDATA[<<软件工程>>]]></value>
</property>
<property name="address" value="<<软件工程1>>"></property>
注入外部bean、内部bean、级联bean。
public class UserService {
//创建UserDao属性,生成set方法
private UserDao userDao;
public UserDao getUserDao() {
return userDao;
}
public void setUserDao(UserDao userDao) {
this.userDao = userDao;
}
public void serviceAdd(){
System.out.println("service add................");
userDao.update();
}
}
<bean id="userService" class="com.rsh.spring5.service.UserService">
<property name="userDao" ref="userDao">
</property>
</bean>
<bean id="userDao" class="com.rsh.spring5.dao.UserDaoImpl"></bean>
@Test
public void testUserService(){
//加载spring配置文件
ApplicationContext context = new ClassPathXmlApplicationContext("bean2.xml");
//获取配置创建对象
UserService userService = context.getBean("userService", UserService.class);
System.out.println(userService);
userService.serviceAdd();
}
内部·bean
<bean id="emp" class="com.rsh.spring5.bean.Emp">
<property name="EName" value="王思聪"></property>
<property name="EGender" value="男"></property>
<property name="dept">
<bean id="dept" class="com.rsh.spring5.bean.Dept">
<property name="dName" value="保安部"></property>
</bean>
</property>
</bean>
级联赋值
<bean id="emp" class="com.rsh.spring5.bean.Emp">
<property name="EName" value="张三"></property>
<property name="EGender" value="男"></property>
<property name="dept" ref="dept"></property>
</bean>
<bean id="dept" class="com.rsh.spring5.bean.Dept">
<property name="dName" value="财务部"></property>
</bean>
级联赋值写法二
<bean id="emp" class="com.rsh.spring5.bean.Emp">
<property name="EName" value="王梅"></property>
<property name="EGender" value="男"></property>
<property name="dept" ref="dept"></property>
<property name="dept.dName" value="技术部"></property>
</bean>
<bean id="dept" class="com.rsh.spring5.bean.Dept">
<property name="dName" value="财务部"></property>
</bean>
public Dept getDept() {
return dept;
}
public void setDept(Dept dept) {
this.dept = dept;
}
基于xml注入数组、集合、map、set属性。
<bean id="stu" class="com.rsh.spring5.collectionType.Stu">
<property name="courses">
<array>
<value>软件工程</value>
<value>数据库程序设计</value>
<value>php程序设计</value>
<value>web应用开发</value>
</array>
</property>
<property name="list">
<list>
<value>软件工程</value>
<value>数据库程序设计</value>
<value>php程序设计</value>
<value>web应用开发</value>
</list>
</property>
<property name="map">
<map>
<entry key="software" value="软件工程"></entry>
<entry key="sqlserver" value="数据库程序设计"></entry>
<entry key="php" value="php程序设计"></entry>
<entry key="web" value="web应用开发"></entry>
</map>
</property>
<property name="set">
<set>
<value>软件工程</value>
<value>数据库程序设计</value>
<value>php程序设计</value>
<value>web应用开发</value>
</set>
</property>
</bean>
集合中的元素是对象
<property name="courseList">
<list>
<ref bean="course1"></ref>
<ref bean="course2"></ref>
<ref bean="course3"></ref>
<ref bean="course4"></ref>
</list>
</property>
<bean id="course1" class="com.rsh.spring5.collectionType.Course">
<property name="cName" value="软件工程"></property>
<property name="tName" value="王建民"></property>
</bean>
<bean id="course2" class="com.rsh.spring5.collectionType.Course">
<property name="cName" value="数据库程序设计"></property>
<property name="tName" value="杨子光"></property>
</bean>
<bean id="course3" class="com.rsh.spring5.collectionType.Course">
<property name="cName" value="php程序设计"></property>
<property name="tName" value="刘丹"></property>
</bean>
<bean id="course4" class="com.rsh.spring5.collectionType.Course">
<property name="cName" value="web应用设计"></property>
<property name="tName" value="雷宇"></property>
</bean>
提取集合注入部分
(1) 引入命名空间
xmlns:util="http://www.springframework.org/schema/util"
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd
<util:list id="bookList">
<value>软件工程</value>
<value>数据库程序设计</value>
<value>php程序设计</value>
<value>web应用开发</value>
</util:list>
<bean id="course1" class="com.rsh.spring5.collectionType.Course1">
<property name="list" ref="bookList"></property>
</bean>
IOC bean管理有两种bean
一种普通·bean另一种就是工厂bean(FactoryBean)
普通bean:在配置文件定义bean类型返回该类型。
工厂bean:在配置文件定义的bean类型可以跟返回类型不一样。
第一部创建类,这个类作为工厂bean,实现接口FactoryBean
第二步实现接口里面的方法,在实现的方法中返回定义bean类型。
<bean id="myBean" class="com.rsh.spring5.factoryBean.MyBean"></bean>
public class MyBean implements FactoryBean<Course> {
@Override
public Course getObject() throws Exception {
Course course = new Course();
course.setcName("数学");
course.settName("梨花");
return course;
}
@Override
public Class<?> getObjectType() {
return null;
}
@Override
public boolean isSingleton() {
return FactoryBean.super.isSingleton();
}
bean的作用域,bean是否是单实例。
Spring默认是单实例scope属性,第一个值 ,singleyon,单实例对象。
Prototype表示多实例对象。
<bean id="book" class="com.rsh.spring5.Book" scope="prototype">
单实例对象在加载配置文件时创建对象。
Bean的生命周期
第一步,构造方法被执行
第二步,set方法被执行
第三步,初始化方法被执行
第四步,获取对象方法被执行
第五步,销毁方法被执行
Bean的后置处理器
在初始化之前执行的方法
在初始化之后执行的方法
第一步,构造方法被执行
第二步,set方法被执行
在初始化之前执行的方法
第三步,初始化方法被执行
在初始化之后执行的方法
第四步,获取对象方法被执行
第五步,销毁方法被执行
Bean自动装配
(1) 根据指定装配规则(属性名称或者属性类型),spring自动将匹配的属性值进行注入。
Autowrite属性两个值
ByName根据属性名注入,注入值bean的id值和类属性名相同。
ByType根据属性类型自动注入。
<bean id="emp" class="com.rsh.spring5.autowrite.Emp" autowire="byName">
<!-- <property name="dept" ref="dept"></property>-->
</bean>
<bean id="dept" class="com.rsh.spring5.autowrite.Dept"></bean>
Bean引入外部属性文件
配置数据库信息
(1) 配置德鲁伊数据库连接池
<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/stu"></property>
<property name="username" value="root"></property>
<property name="password" value="041765rsh"></property>
</bean>
(2) 把外部的properties文件引入spring配置文件
引入context命名空间,xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
<context:property-placeholder location="jdbc.properties"/>
<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>
IOC操作的注解方式
- 什么是注解
(1) 注解是代码的特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值)(2)使用注解,注解作用在类、方法、属性上。(3)使用注解目的,简化xml配置
2 spring针对Bean管理创建对象提供注解
(1)@Component普通注解方式
(2)@Service 用于service层
(3)@Controller用于外部层
(4)@Reposity 用于dao层
*上面四个注解功能是一样的,都可以用来创建bean实例。
基于注解方式的对象创建
引入依赖,开启组件扫描,
当@Compent的“(value = “”)“省略的话,默认是首字母小写的类名。
@Component
public class UserService {
public void add(){
System.out.println("userService add .............");
}
}
我这里报错了,因为我的运行环境时JDK17,只有spring-framework 5.3以上版本才可以使用。所以我换了导入的依赖,问题就解决了。
基于注解方式的属性注入
注解:@AutoWrited根据属性类型@Qualifier属性名称 @Resource两者都可以(三个都是对象类型的)
完全注解开发
将xml类替换成配置类
@Configuration
@ComponentScan(basePackages = {"com.rsh"})
public class SpringConfig {
}

浙公网安备 33010602011771号