-
IOC 操作Bean 管理(FactoryBean)
-
Spring 有两种类型的bean,一种是普通bean 另一种是工厂bean(FactoryBean)
-
普通bean 在配置文件中定义的bean类型就是返回类型
-
工厂bean 在配置文件中定义的bean 类型可以和返回类型不一样
-
创建类,让这个类作为工厂bean 实现接口FactoryBean
public class MyBean implements FactoryBean<Course> { //定义返回bean @Override public Course getObject() throws Exception { Course course = new Course(); course.setCname("abc"); return course; } @Override public Class<?> getObjectType() { return null; } @Override public boolean isSingleton() { return false; } }
-
实现接口里面的方法,在实现的方法中定义返回的bean类型
<bean id="mybean" class="com.atguigu.spring5.factorybean.MyBean"> </bean>
@Test public void testCollection3() { ApplicationContext context=new ClassPathXmlApplicationContext("bean3.xml"); Course myBean = context.getBean("mybean", Course.class); System.out.println(myBean); }
-
-
-
-
IOC 操作Bean的作用域
-
在Spirng里面,设置创建bean实例是单实例还是多实例
-
在Spring里面,默认情况下,bean是单实例
@Test public void testCollection2() { ApplicationContext context=new ClassPathXmlApplicationContext("bean2.xml"); Book book = context.getBean("book", Book.class); Book book2 = context.getBean("book", Book.class); book.test(); System.out.println("book = " + book); System.out.println("book2 = " + book2); }
list = [java, php, MySql] book = com.atguigu.spring5.Book@727803de book2 = com.atguigu.spring5.Book@727803de
-
如何设置单实例还是多实例
-
在spirng配置文件bean标签里面有属性(scope)用户设置单实例还是多实例
-
scope 属性值
-
第一个默认值 singleton,表示单实例对象
-
第二值 prototype,表示是多实例对象
<!-- 2.提取list集合类型属性注入使用--> <bean id="book" class="com.atguigu.spring5.Book" scope="prototype"> <property name="list" ref="bookList"> </property> </bean>
-
-
-
-
singleton和prototype
- singleton 单实例 prototype 多实例
- 设置scope值是singleton时候,加载spring 配置文件就会创建单实例对象 设置scope值是prototype时候,不是在spiring配置文件时候创建对象,在调用getBean方法时候创建多实例对象
-
-
IOC操作Bean的生命周期
-
生命周期
- 从对象创建到对象销毁的过程
-
bean 生命周期
- 通过构造器创建bean实例(无参数构造)
- 为bean 的属性设置值对其他bean 引用(调用set方法)
- 调用bean的初始化的方法(需要进行配置)
- bean 可以使用了(对象获取到了)
- 当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
-
演示bean生命周期
//无参数构造 public Orders() { System.out.println("第一步,执行无参数构造创建bean实例"); } private String oname; public void setOname(String oname) { this.oname = oname; System.out.println("第二步,调用set方法设置属性值"); } // 创建执行的初始化的方法 public void initMethod() { System.out.println("第三步 执行初始化的方法"); } // 创建销毁的初始化的方法 public void destroyMethod() { System.out.println("第五步 执行销毁的方法"); } }
<bean id="orders" class="com.atguigu.spring5.bean.Orders" init-method="initMethod" destroy-method="destroyMethod"> <property name="oname" value="手机" > </property> </bean>
@Test public void testCollection4() { ApplicationContext context=new ClassPathXmlApplicationContext("bean4.xml"); Orders orders = context.getBean("orders", Orders.class); System.out.println("orders = " + orders); System.out.println("第四步 获取创建bean实例对象"); //手动让bean 销毁 ((ClassPathXmlApplicationContext) context).close(); }
-
bean的后置处理器,bean的生命周期有七步
-
通过构造器创建bean实例(无参数构造)
-
为bean 的属性设置值对其他bean 引用(调用set方法)
-
调用bean实例传递bean后置处理器方法
postProcessBeforeInitialization
-
调用bean的初始化的方法(需要进行配置)
-
把bean实例传递bean后置处理器的方法
postProcessAfterInitialization
-
bean 可以使用了(对象获取到了)
-
当容器关闭的时候,调用bean的销毁的方法(需要进行配置销毁的方法)
-
-
演示添加后置处理器效果
(1) 创建类,实现接口BeanPostProcessor
-
-
-
IOC 操作Bean管理(xml自动装配)
-
什么是自动装配
(1) 根据指定装配规则(属性名称或者属性类型),Spring自动将匹配的属性值进行注入
-
演示自动装配
(1) 根据属性名称注入,注入值bean的id值和类属性名称一样
<!--实现自动装配 bean标签属性autowire,配置自动装配 autowire 属性常用两个值:byName根据属性名称注入,注入值bean的id值和 byType根据属性类型注入
(2) 根据属性自动注入
-
-
IOC操作Bean管理(外部属性文件)
-
直接配置数据库信息
-
配置德鲁伊连接池
-
引入德鲁伊连接池的jar包
-
直接配置连接池
<!--直接配置连接池--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"></property> <property name="url" value="jdbc:mysql://locallhost:3306/userDb"></property> <property name="username" value="root"></property> <property name="password" value="root"></property> </bean>
-
-
引入外部属性文件配置数据库连接池
(1). 创建外部属性文件,properties格式文件,写数据库信息prop.driverClass=com.mysql.jdbc.Driver prop.url=jdbc:mysql://locallhost:3306/userDb prop.userName=root prop.password=root
(2). 加入属性标签
<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">
(3) 引入外部文件
(4) 配置连接池
<!-- 引入外部属性文件--> <context:property-override 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 操作bean管理(基于注解方式)
-
什么是注解
- 注解是代码特殊标记,格式:@注解名称(属性名称=属性值,属性名称=属性值…)
- 使用注解,注解作用在类上面,方法上面,属性上面
- 使用的注解:简化xml配置
-
Spring针对Bean管理中创建对象提供注解
-
@Component
-
@Service
-
@Controller
-
@Repository
上面四个注解功能是一样的,都可以用来创建bean实例
-
-
基于注解方式实现对象创建
-
引入依赖aop 依赖
-
开启组件扫描
-
名称空间
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 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">
-
<!--开启组件扫描 1. 如果扫描多个包,多个包使用逗号隔开 2. 扫描包上层目录 --> <context:component-scan base-package="com.atguigu.spring5.test,com.atguigu.spring5.test.service"></context:component-scan> <context:component-scan base-package="com.atguigu"></context:component-scan>
-
-
创建类,在类上面添加创建对象的注解
//在注解里面的value 属性值可以省略不写 默认是类名首字母小写 @Component(value = "userService") public class UserService { public void add() { System.out.println("service add......"); } }
-
开启组件扫描细节配置
<!--实例一 use-default-filters 表示现在不使用默认filter 自己配置filter context:include-filter,设置扫描那些内容 --> <context:component-scan base-package="com.atguigu.spring5" use-default-filters="false"> <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan> <!--实例二 下面配置扫描包中所有内容 context:exclude-filter: 设置那些内容不进行扫描 --> <context:component-scan base-package="com.atguigu.spring5"> <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/> </context:component-scan>
-
-
基于注解方式实现属性注入
-
@Autowired:根据属性类型进行自动装配
-
把service和dao对象创建,在service和dao类添加创建对象注解
-
在service注入dao对象对象,在Service类中添加dao类型属性,在属性上面使用注解
@Service public class UserService { //定义dao类型属性 // 不需要加set方法 //添加注入属性注解 @Autowired //根据类型进行注入 private UserDao userDao; public void add() { System.out.println("service add......"); userDao.add(); } }
-
-
@Qualifier:根据属性名称进行注入
@Qualifier注解的使用,和上面@Autowired一起使用
//在注解里面的value 属性值可以省略不写 默认是类名首字母小写 //@Component(value = "userService") //@Service // @Controller @Service public class UserService { //定义dao类型属性 // 不需要加set方法 @Autowired //根据类型进行注入 @Qualifier(value = "userDaoImp11") //根据名称属性进行注入 private UserDao userDao; public void add() { System.out.println("service add......"); userDao.add(); } }
-
@Resource:可以根据类型注入,可以根据名称注入
@Service public class UserService { //定义dao类型属性 // 不需要加set方法 // @Autowired //根据类型进行注入 // @Qualifier(value = "userDaoImp11") //根据名称属性进行注入 // private UserDao userDao; // @Resource //根据类型进行注入 @Resource(name = "userDaoImp11") //根据名称进行注入 private UserDao userDao; public void add() { System.out.println("service add......"); userDao.add(); } }
-
@Value:注入普通类型属性
@Value(value = "adc") private String name;
-
-
完全注解开发
-
创建配置类,替代xml配置文件
@Configuration // 作为配置,代替xml配置文件 @ComponentScan(basePackages = {"com.atguigu"}) public class SpringConfig { }
-
编写测试类
@Test public void testService2() { // 加载配置类 ApplicationContext context=new AnnotationConfigApplicationContext(SpringConfig.class); UserService userService = context.getBean("userService", UserService.class); System.out.println("userService = " + userService); userService.add(); }
-