一 spring 注入的基本使用
1 set方式注入 配置文件 <property><value> 标签来注入
<bean id="person" class="xxx.Person">
<property name="id" value="10"/>
<property name="name" value="zhangsan"/>
</bean>
2构造器方式注入
public class Person {
private String id;
private String name;
public Person(String id, String name) {
this.id = id;
this.name = name;
}
}
<bean id="person" class="xxx.Person">
<constructor-arg> <value>20</value> </constructor-arg>
<constructor-arg> <value>zhangsan</value> </constructor-arg>
</bean>
一般来说使用set注入,因为构造注入麻烦,有重载的问题 spring底层框架大量使用set注入
一般对象,可以直接通过new构造器创建对象,Person PersonDao
复杂对象,不能通过直接new构造器方法创建对象,如connection \ sqsessionFactory
class.forname("com.mysql.jdbc.Driver")
conn = DriverManager.getConnection();
SqlsessionFactory
inputStream inputStream = Resouce.getResourcrAsStream();
new SqlSessionFactoryBuilder().build(inputstream);
二 spring工厂创建复杂对象的4种方式
1)实现factoryBean接口
public class ConnectionFactoryBean implements FactoryBean {
@Override
public Object getObject() throws Exception {
//书写创建负责对象的代码,并把复杂对象作为返回值 返回
Class.forName("com.mysql.jdbc.Deiver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
return connection;
}
@Override
public Class<?> getObjectType() {
//返回所创建复杂对象的class对象
return Connection.class;
}
@Override
public boolean isSingleton() {
//每一次调用都需要创建一个新的复杂对象
return false;
}
}
<bean id="conn" class="com.demo.ConnectionFactoryBean">
@Test
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
Connection connection = (Connection) applicationContext.getBean("conn");
ConnectionFactoryBean connectionFactoryBean = (ConnectionFactoryBean) applicationContext.getBean("&conn");
System.out.println(connection); //打印connection对象
System.out.println(connectionFactoryBean);//打印connectionFactoryBean对象
}
2)实列工厂
避免spring框架的侵入 整合遗留系统(拿不到源码)
同下面的普通工厂
3)静态工厂
同下面的静态工厂
4)使用@Configuration @Bean方式
@Configuration
public class ConfigurationDemo {
@Bean
public Connection connection(){
Connection connection =null;
try {
Class.forName("com.mysql.jdbc.Deiver");
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
} catch (Exception e) {
e.printStackTrace();
}
return connection;
}
}
三 spring 创建bean的三种方式
1 使用默认构造器函数创建 在spring的配置中使用bean标签 配以id和class属性之后,且没有其他属性和标签时,采用的是默认构造器创建bean,此时如果类中没有默认构造器,则对象无法创建
<bean id="XX" class="com.XXX.类名"></bean>
2 使用普通工厂中的方法创建对象(使用某个类中的方法创建对象,并存入spring容器)
public class InstanceFactory{
publice Connection getConnectionInstance(){
Class.forName("com.mysql.jdbc.Deiver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
return connection;
}
}
<bean id="instanceFactory" class="com.xxx.factory.InstanceFactory"></bean>
<bean id="conn" factroy-bean="instanceFactory" factory-method="getConncetionInstance"></bean>
3使用静态工厂中的静态方法创建对象(使用某个类中的静态方法创建对象,并存入spring容器)
public class StaticFactory{
publice static IAccountService getConncetionInstance(){
Class.forName("com.mysql.jdbc.Deiver");
Connection connection =
DriverManager.getConnection("jdbc:mysql://localhost:3306/demo","root","123456" );
return connection;
}
}
<bean id="conn"class="com.xxx.StaticFactory" factory-method="getConncetionInstance"></bean>
public void test1(){
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
Connection connection = (Connection) applicationContext.getBean("conn");
}