学习记录笔记~
为什么bean默认为单例?
适合交给容器管理的bean:表现层对象、业务层对象、数据层对象、工具对象
不适合交给容器管理的bean:封装实体的域对象
实例化bean的四种方式
<!-- 1.构造方法实现bean-->
<bean id="bookDaoImpl" name="daoimpl" class="com.smart.dao.impl.BookDaoimpl" scope="prototype"/>
<bean id="bookServiceImpl" name="service" class="com.smart.service.impl.BookServiceImpl" scope="prototype">
<property name="bookDao" ref="daoimpl"/>
</bean>
<!--2.使用静态工厂实例化bean-->
<bean id="orderDao" class="com.smart.factory.OrderDaoFactory" factory-method="getOrderDao"/>
<!--3.使用实例化工厂实例化bean-->
<bean id="userFactory" class="com.smart.factory.UserDaoFactory"/>
<bean id="userDao" factory-method="getUserDao" factory-bean="userFactory"/>
<!--4.使用FactoryBean实例化bean-->
<bean id="userDao" class="com.smart.factory.UserDaoFactoryBean"/>
bean的生命周期:bean从创建到销毁的整体过程。
bean生命周期控制:在bean创建后到销毁前做一些事情。
生命周期的控制:1.配置格式控制(init-method,destory-method)
2.实现InitializingBean,DisposableBean接口控制生命周期
关闭容器:
依赖注入
向一个类中传递数据的方式有普通方法(set)和构造方法两种
依赖注入的方式:
setter注入:简单类型,引用类型
构造器注入:简单类型,引用类型
简单类型的注入:第一步写明set方法,第二部在配置文件中使用property标签中的value属性对其进行赋值,这里的name是成员变量的名字。
<bean id="bookService" class="com.smart.service.impl.BookServiceImpl">
<!-- name是该类中包含的私有成员变量名,ref中是已被定义的bean-->
<property name="bookDao" ref="bookDao"/>
<property name="userDao" ref="userDao"/>
</bean>
构造器注入:第一步写有参的构造方法,第二步在配置文件中使用constructor-arg标签对其进行配置,但需要注意的是这里name的值是参数的名字不是成员变量的名字
<bean id="bookService" class="com.example.demospring_2.service.impl.BookServiceImpl">
<constructor-arg name="bookDao" ref="bookDao"/>
<constructor-arg name="userDao" ref="userDao"/>
</bean>
耦合度过高
<constructor-arg type="java.lang.String" value="sql"/> <constructor-arg type="int" value="999"/> 降低耦合度的两种选择: 将写死的参数名变为参数类型可降低耦合度 <constructor-arg name="databaseName" value="sql"/> <constructor-arg name="connectionNum" value="999"/>解决参数类型重复
<constructor-arg index="0" value="sql"/> <constructor-arg index="1" value="999"/>
依赖自动装配
IoC容器根据bean所依赖的资源在容器中自动查找并注入到bean中的过程称为自动装配。
byName是按名称自动装配byByte是按类型自动装配
<bean id="bookService" class="com.example.demospring_2.service.impl.BookServiceImpl" autowire="byName">
注解开发与纯注解开发
配置文件的管理虽然能够提高new对象的性能,但开发效率不高,所以Spring后来改为使用注解开发,从部分注解到纯注解开发,可以极大的提高开发的速度,现在的大部分SpringBoot项目均使用纯注解开发方式,也就是说前面的配置文件基本上用不到了,但并没白学哦,前面的铺垫可以更好的理解注解的原理。
//加载配置文件初始化容器————配置文件开发 ApplicationContext ctx=new AnnotationConfigApplicationContext(SpringConfig.class); 单独建立一个SpringConfig类————纯注解开发 @Configuration //设定当前类为配置类 @ComponentScan({"com.example.demospring_3"}) // 代替原先配置文件中的这行代码<context:component-scan base-package="com.example.demospring_3.dao.impl"/> public class SpringConfig { } //加载配置文件初始化容器 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationcontext.xml.bak");