Spring之ioc功能

实验2:根据bean的类型从IOC容器中获取bean的实例

在这里插入图片描述

  • way1:ioc.getBean(类型.class);
  • way2:ioc.getBean(“id”,类型.class);

实验3:

  • way1: 通过构造器为bean的属性赋值
	 <!-- 调用有参构造器constructor-arg进行创建对象并复赋值 一个构造器就一个参数 -->
	 <constructor-arg name="lastname" value="tt"></constructor-arg>
	 <constructor-arg name="age" value="11"></constructor-arg>
	 <constructor-arg name="email" value=""></constructor-arg>
	 <constructor-arg name="gender" value=""></constructor-arg>

	</bean>

在这里插入图片描述- index,type属性介绍在这里插入图片描述
在这里插入图片描述

  • way2: 通过p名称空间为bean赋值

名称空间是在xml里面防止标签重复的 like 前缀
在这里插入图片描述在这里插入图片描述

  • 导入:xmlns:p=“http://www.springframework.org/schema/p”
  • 使用:
	<bean id="person7" class="com.bean.person" 
		p:age="1" p:email="4343" p:lastname ="aa" p:gender="name">
	</bean>

实验4:正确的为各种属性赋值

(1)测试使用null值 — 默认不赋值

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
true ,是一个car。 严格的地址引用 ref是严格的(改一个都会变)

(2)引用类型赋值(引用其他bean、引用内部bean)

对象使用bean标签创造
	<property name="car">
			<bean class="com.bean.Car">

使用spring框架,用xml方式进行bean装配出现“The fully qualified name of the bean’s
class, except if it serves…”。

原因是class未写全类名,检查开发jar包是否导入,全类名是否书写正确。

(3) 集合类型赋值(List、Map、Properties)、

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(4)util名称空间创建集合类型的bean

  • props :
    在这里插入图片描述
  • util名称空间创建集合类型的bean,方便引用
    (相当于一个外部bean)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 级联属性赋值
    在这里插入图片描述
    相当于绑定,被绑定的值和这个一起更改。

实验5:配置通过静态工厂方法创建的bean、实例工厂方法创建的bean、FactoryBean★

  • 默认方式:是框架利用反射new出来的实例
  • Factory模式:工厂类创建对象

    classname 名字 = 工厂类.getclassname (String arg)

(1)静态工厂:本身不用创建对象,通过静态方法调用

对象 = 工厂类.工厂方法名()
以下为工厂类在这里插入图片描述
以下为bean配置

  • class:指定工厂全类名
  • factory-method :指定工厂方法
  • construcor-arg:传参
    在这里插入图片描述

(2)实例工厂: 工厂本身需要创建对象,

工厂类 工厂对象 = new 工厂类()
工厂对象.getclassname()
以下为工厂类在这里插入图片描述
以下为bean配置在这里插入图片描述

FactoryBean是Spring的接口,可以自动设置,自己实现类

写你需要的工厂类
在这里插入图片描述
在这里插入图片描述
几个函数

  • getObject:工厂方法 返回创建的对象
    在这里插入图片描述

isSingLetion():是单例?

实验6:通过继承实现bean配置信息的重用

继承通过标签 parent,使用如下,并且继承的是对bean的配置,并不是如类一般的父子继承。
在这里插入图片描述

实验7:通过abstract属性创建一个模板bean

实验8:bean之间的依赖

原来的创建bean对象的顺序,是按照你在xml配置文件里的顺序,可以通过depends-on来改变创建顺序,可以同时依赖多个
在这里插入图片描述
这里就先创建person,book再创建car(peson和book的顺序按照depends-on里的顺序)

实验9:测试bean的作用域,分别创建单实例和多实例的bean★

bean的作用域一般是指是否为单实例,默认为单实例

  • prototype:多实例
    (1)会创建多个bean
    (2) 获取的时候容器创建bean
  • singleton:单实例
    (1)在启动之前完成了创建对象,保存子啊容器
    (2)只有一个对象bean,反复获取也是同一个
  • request:web环境,同一次请求创建一个BEAN
  • session:web环境,同一次会话创建一个BEAN
  • 使用方法:scope=“prototype / singleton”

实验10:创建带有生命周期方法的bean

bean的生命周期是从创建到销毁,也可以自定义生命周期方法。
ioc注册的bean:
(1)单实例:启动前创建,关闭容器也销毁
(2)多实例:获取的时候创建,关闭也不销毁
在这里插入图片描述
(1)单实例:(启动)构造器->初始化(关闭)销毁
(2)多实例:获取(构造器->初始化)->关闭不会调用销毁

实验11:测试bean的后置处理器

  • 过程:
    (1)编写后置处理器的实现类
    (2)将后置处理器注册在配置文件中
  • 初始化前调用postProcessBeforeInitialization:
    Object bean:将要初始化的bean
    beanname :bean在xml中配置的id
public Object postProcessBeforeInitialization(Object bean,String beanname ) throws BeansException{
...
return bean
}

实验12:引用外部属性文件★

数据库连接池作为单实例是最好的,一个项目一个连接池,管理连接,使用spring

在这里插入图片描述

<bean id="dataSoucre"class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="root"></property>
		<property name="password" value="12345"></property>
		<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/test"></property>
		<!-- 驱动类 -->
		<property name="driverClass" value="com.mysql.jdbc.Driver"></property>
	</bean>

使用连接池:

	public void test02() throws SQLException{
		//(1)拿到容器池
		DataSource bean =ioc.getBean(DataSource.class);
		System.out.println(bean.getConnection());
		
	}
主要重点是Spring管理连接池

依赖Context名称空间

引入加载外部配置文件:context:property-placeholder/
location:引入内路径下的文件location=“classpath:dbconfig.properties”/>
取出其值${名称} 动态取出
在这里插入图片描述

<context:property-placeholder location="classpath:dbconfig.properties"/>
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<property name="user" value="${username}"></property>
		<property name="password" value="${password}"></property>
		<property name="jdbcUrl" value="${jdbcUrl}"></property>
		<!-- ${key}为动态取得key的值 -->
		<property name="driverClass" value="${driverClassl}"></property>
	</bean>

在这里插入图片描述

实验13:基于XML的自动装配

自定义类型自动赋值
javabean(基本类型) (自定义类型的属性是一个对象,这个对象可能在容器中存在)

  • property 手动赋值
<bean id="person" class="com.bean.person">
			<property name="car" ref="car"></property>
		</bean>
  • 自动装载 autowire
    (1)byName:在容器中找到和属性一样的名字赋值,找不到装配null
    (2)byType:以属性的类型去查找容器中有没有这个类型的(id不同也可以)
    (3)constructor:按照构造器赋值,有参构造函数的值,如果有多个,按照参数名作为id继续匹配
    (4)default / no :不自动赋值

实验14:[SpEL(Spring expression language表达式语言)测试]

  • 在SpEL中使用字面量:#{ a+b}自动计算
  • 引用其他bean:#{id名}
  • 引用其他bean的某个属性值:#{id名.属性名}
  • 调用非静态方法:#{对象id.方法名(1,2)}
  • 调用静态方法:#{T(全类名).静态方法名(1,2)}

实验15:通过注解分别创建Dao、Service、Controller★

通过给bean加入注解,可以快速将bean加到IOC容器中
Controller:控制器,控制网站跳转逻辑

Spring注解(spring不会去查验):
在这里插入图片描述

  • 给添加的组件上标4个注解的任何一个

  • 通过 spring自动扫描添加了注解的组件,依赖context名称空间:
    <context:component-scan 自动组件扫描>
    base-package:指定扫描的基础包,精确到两级

  • 要导入aop包

  • 被配置的类的id就是默认首字母小写改写就是价格括号(“id名”),作用域是单实例的(修改@Scope(value=“prototype”))

实验16:使用context:include-filter指定扫描包时要包含的类

在这里插入图片描述

实验17:使用context:exclude-filter指定扫描包时不包含的类

在这里插入图片描述

实验18:使用@Autowired注解实现根据类型实现自动装配★DI(依赖注入)

不用写任何的工具类来配置,不需要new
在这里插入图片描述

在这里插入图片描述

  • DAO
package com.zy.dao;
import org.springframework.stereotype.Repository;
@Repository //和数据库配置相关
public class BookDao {
	public void saveBook(){
		System.out.println("图书保存");
	}
}

  • servlet
package com.zy.servlet;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

import com.zy.service.BookService;

@Controller
public class BookServlet {
	
	@Autowired
	private BookService bookservice;
	
	public void doGet(){
		bookservice.save();
	}
}

  • service
package com.zy.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.zy.dao.BookDao;

@Service
public class BookService {
	@Autowired
		private BookDao bookDao;
		
		public void save(){
			System.out.println("bookservice");
			bookDao.saveBook();
			
		}
}

  • test
package com.zy.test;

import static org.junit.Assert.*;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zy.servlet.BookServlet;

public class IOCtest {
	ApplicationContext ioc = new ClassPathXmlApplicationContext("ioc.xml");
	@Test
	
	public void test02(){
		BookServlet bookServlet = ioc.getBean(BookServlet.class);
		bookServlet.doGet();
	}
	public void test() {
		Object bean = ioc.getBean("bookDao");
		System.out.println(bean);
	}

}

  • 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"
	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-4.0.xsd">
     <context:component-scan base-package="com.zy"></context:component-scan>
     
</beans>

实验19:如果资源类型的bean不止一个,

    默认根据@Autowired注解标记的成员变量名作为id查找bean,进行装配★

在这里插入图片描述

实验20:如果根据成员变量名作为id还是找不到bean,

    可以使用@Qualifier注解明确指定目标bean的id,让spring不使用变量名★

实验22:@Autowired注解的required属性指定某个属性允许不被设置

在这里插入图片描述
总结:
在这里插入图片描述在这里插入图片描述

实验21:在方法的形参位置使用@Qualifier在这里插入图片描述

在这里插入图片描述

Spring单元测试

在这里插入图片描述
好处:我们不用ioc.getBean ()获取组件了,直接Autowired组件。 Spring为我们自动装配
申.

测试泛型体赖注入

效果

以前的项目:bookdao继承basedao
与之对应得–》basedao定义了基本的增删改查–》bookdao来实现方法basedao的方法–》service的组件就是来调用bookdao的服务。

过进到spring,xxdao加入spring @Repository,xxservice加入spring组件@Service,内部的xxdao使用@Autowired自动装配
在这里插入图片描述
比如说现在有两个对象,book和user,两个server都实现来service方法的save,将其抽取成一个baseService
在这里插入图片描述
再让bookservice和userservice继承这个baseservice类

原理

在这里插入图片描述

带依赖的父类类型

在这里插入图片描述

IOC总结
在这里插入图片描述
ioc是容器,spring管理所有组件

  1. 依赖注入:@Autowired自动赋值

  2. 要使用spring的功能(ioc,aop)必须加入到容器中
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值