实验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管理所有组件
-
依赖注入:@Autowired自动赋值
-
要使用spring的功能(ioc,aop)必须加入到容器中