依赖注入
运行环境 Eclipse
Spring IoC容器的依赖注入分为三种:构造器注入,setter注入和接口注入。
Bean资源的配置在src目录下的spring-cfg.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
<!-- Spring Bean 配置代码 -->
</beans>
- 构造器注入(依赖构造方法的实现,其中Bean的构造方式可以是有参的也可以是无参的)
<!-- 对于一个A类 有一个构造函数 A(String ,String)的依赖注入-->
<bean id="对象名" class="类的全限定名">
<constructor-arg index="0" value="第一个参数的值"/>
<constructor-arg index="1" value="第二个参数的值"/>
</bean>
- setter注入(利用JavaBean规范所定义的setter方法来完成注入,对于的Bean有一个无参的构造器,之后使用setter注入为其设置对应属性的值)
<!-- 对于构造函数 A()的依赖注入 setter注入的方式 假设A类含有两个属性 属性1和属性2-->
<bean id="对象名" class="类的全限定名">
<property name="属性名1" value="属性1对应的值"/>
<property name="属性名2" value="属性2对应的值"/>
</bean>
- 接口注入(需要的资源来自于外界,例如在Tomcat中配置数据库连接资源,然后使用JNDI的形式去获取这个资源)
<!--在Eclipse配置后Tomcat生成的server项目中对于的tomcat有context.xml文件,在其中配置 -->
<Context>
<Resource
name="JNDI名字"
auth="Container"
type="javax.aql.DataSource"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/数据库名?zeroTimeBehavior=convertToNull"
username="root"
password="123456"/>
</Context>
<!--此时对于Eclipse是否自动将Tomcat的数据库驱动包复制到对应的lib文件下,如果没有,需要手动复制-->
<!-- Spring通过接口注入方式获取到Tomcat启动的数据库资源-->
<bean id="自定义资源名" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName">
<value>java:comp/env/jdbc/ssm</value>
</property>
</bean>
装配Bean
- 通过XML进行装配
<!-- 装配各种集合 -->
<bean id="自定义id名" class="类的全限定名">
<!-- 普通属性 -->
<property name="id" value="1"/>
<!-- 各类集合 -->
<!-- 如果集合中是类的对象,对于类对象进行装配生成了对象之后,在集合中是需要通过<ref bean="定义的bean对象名“/>来引用的而不是<value>标签-->
<!-- 需要注意的是对于Map集合<entry key-ref="键Bean对象名" value-ref="值Bean对象名"/> -->
<property name="list">
<list>
<value>list1</value>
<value>list2</value>
</list>
</property>
<property name="map">
<map>
<entry key="key1" value="map1"/>
<entry key="key2" value="map2"/>
</map>
</property>
<property name="props">
<props>
<prop key="prop1">props1</prop>
<prop key="prop1">props1</prop>
</props>
</property>
<property name="set">
<set>
<value>set1</value>
<value>set1</value>
</set>
</property>
<property name="array">
<array>
<value>array1</value>
<value>array2</value>
</array>
</property>
</bean>
- 通过注解装配(更多时候使用这个方法,使用多的是自动装配的方式但是需要注意歧义性)
//首先使用@Component注解使Spring IoC扫描生成Bean实例
//@Value代表的是值的注入
//@Primary 表示首要的,优先使用该类注入,防止歧义性问题
@Component(value="role")
@Primary
public class A {
@Value("1")
private Long id;
@Value("value1")
private String value;
@Value("value2")
private String value2;
//getter与setter方法省略
...
/* 定义一个告诉Spring IoC去哪里扫描的类*/
package 包名需要与上面的POJO类的包名保持一致;
import org.springframework.context.annotation.ComponentScan;
@ComponentScan
public class PoJoConfig {
}
/*此时就可以生成容器了*/
public class AnnotationMain {
public static void main(String[] args) {
ApplicationContext context =
new AnnotationConfigApplicationContext(PoJoConfig.class);
A a= context.getBean(A.class);
System.out.println(a.getId());
}
}
/*还有一种简单的是使用自动装配*/
//先定义一个接口
public interface AService{
public void info();
}
//接口的实现类
public AServiceImpl implements AService{
//@Autowired 表示自动装配
//@Qualifier("AService") 表示按照AService的名字装配,消除歧义性
@Autowired
@Qualifier("AService")
A a = null;
//getter/setter方法
@Overrid
public void info(){
...
}
}
/*还有一种@Bean的注解,可以注解到方法上将返回的对象作为Bean,但是不能注解到类上*/