Spring的IOC介绍
1. IOC 控制反转 就是将对象创建交给spring,实体类一般不交给spring工厂管理
将原本new的对象转移到配置文件 通过<bean>标签
<bean id="userDAO" class="com.codegzy.dao.UserDAOImpl"></bean>
2. DI 依赖注入
三种注入方式:
1. set方式注入(推荐)
2. 构造注入
3. 自动注入
2.1 set方式注入
八种基本类型+String类型 +日期类型的注入
<property name="name" value="zhagnsan"/>
<property name="age" value="21"/>
<property name="id" value="100063"/>
<property name="birthday" value="2012/12/12"/> 不支持日期2012.12.12这种格式 用/隔开
<property name="price" value="23.23"/>
数组类型的注入
<property name="qqs">
<array>
<value>123</value>
<value>456</value>
<value>789</value>
</array>
</property>
引用类型的注入
<property name="userDAO" ref="userDAO"/>
集合类型注入
<property name="lists">
<list>
<value>aaa</value>
<value>bbb</value>
<value>ccc</value>
</list>
</property>
<property name="maps">
<map>
<entry key="aa" value="xiaohei"/>
<entry key="bb" value="xiaoming"/>
<entry key="cc" value="xiaosan"/>
</map>
</property>
<property name="props">
<props>
<prop key="url">jdbc:mysql://localhost:3306/test</prop>
<prop key="driver">com.mysql.jdbc.Driver</prop>
<prop key="username">root</prop>
<prop key="password">123456</prop>
</props>
</property>
小总结:引用类型使用ref属性注入,基本类型使用value属性注入
2.2 构造注入
<constructor-arg index="0" name="id" value="1"/>
<constructor-arg index="1" name="name" value="xiaohei"/>
<constructor-arg index="2" name="age" value="12"/>
<constructor-arg index="3" name="qqs">
<array>
<value>xxx</value>
<value>222</value>
<value>333</value>
</array>
</constructor-arg>
了解即可
2.3 自动注入
autowire=byName
根据注入的属性名与配置文件中bean的id匹配,一致则注入,不一致报错
autowire=byType
根据注入的属性类型,与配置文件中的类型匹配,类型一致注入(在多个实现类时,会产生歧义)
注意: 无论使用以上那种方式注入都需要为属性提供set方法
3. bean的创建模式
1.singleton:单例 默认
2.prototype:多例
<bean id="" class="xxxx.UserController" scope="prototype|singleton">
小总结:在项目开发中service,dao组件单例,控制层必须为:多例
4. bean的生产原理
反射+构造方法
Class.forName("xxx").newInstance();
5. bean的生命周期
何时创建?
随着工厂启动, 所有单例bean随之创建 非单例的bean,每次使用时创建
何时销毁?
工厂关闭,所有bean随之销毁 ( 注意: spring对多例bean管理松散,不会负责多例bean的销毁)
6. 创建复杂对象(类中没有构造方法,或者构造方法不能调用如接口类型或抽象类实例)
//1.类 implements FactoryBean<创建的类型>
public class ConnectionFactoryBean implements FactoryBean<Connection> {
@Override
public Connection getObject() throws Exception {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/test","root","root");
}
@Override
public Class<?> getObjectType() {
return Connection.class;
}
@Override
public boolean isSingleton() {
return false;
}
}
// 2.配置工厂管理
<bean id="connectionFactoryBean" class="com.codegzy.factorybean.ConnectionFactoryBean"></bean>
// 3.获取复杂对象
ApplicationContext context = new ClassPathXmlApplicationContext("spring.xml");
Connection conn = (Connection) context.getBean("connectionFactoryBean");
System.out.println(conn);