概念
Spring IOC(Inversion of Control):控制反转;在传统的程序设计过程中,当一个程序需要调用另外一个程序来完成功能的时候,通常是调用者来创建被调用者的实例,虽然这样很简单也很好理解,但是程序间的耦合性很高,会导致程序越来越臃肿。在Spring中创建被调用者不再是调用者自己来完成,而是利用java的反射机制,通过配置文件或注解来创建实例,因此被称为控制反转。其中创建被调用者的工作由Spring来完成,注入调用者被称为依赖注入。
注入方式
1.使用构造方法提供
-
这种注入方式,调用者需要有默认的构造函数
-
xml
<bean id="" class="调用者路径" > 属性 <constructor-arg name="" value="被调用者路径"></constructor-arg> </bean>
2.使用set方法提供
-
需要在调用者中有被调用者的set方法,如:
private IAccountDao accountDao; public void setAccountDao(IAccountDao accountDao) { this.accountDao = accountDao; }
-
set方法注入
<bean id ="" class "调用者路径"> <property name="" value="被调用者路径"></property> </bean>
3.注解注入
-
在xml中只需配置Spring创建容器时要扫描的包
<context:componet-scan base-packge=""></context:componet-scan>
创建bean的三种方式
1.使用默认函数
<bean id="" class=""></bean>
2.使用普通工厂的方法
当我们想调用的类存在于jar包中,无法通过修改源码的方式来提供默认构造函数,此时可以利用一个工厂类。
public class InstanceFactory {
public IAccountService getAccountService(){
return new AccountServiceImpl();
}
}
xml配置
<bean id = "instanceFactory" class = "工厂类路径"></bean>
<bean id ="" factory-bean="instanceFactory" factory-method="getAccountService"></bean>
3.使用静态工厂中的静态方法
public class StaticFactory {
//方法名与xml配置文件中的要一致
public static IAccountService getAccountService() {
return new AccountServiceImpl();
}
}
<bean id="" class="工厂类的路径" factory-method="getAccountService"></bean>
能注入的数据有三类
1.基本类型和String
<bean id="" class="com.xwj.service.impl.AccountServiceImpl2">
<property name="name" value="Test"></property>
<property name="age" value="19"></property>
</bean>
2.其他bean类型(在配置过程中或注解配置过的bean)
<bean id="" class="com.xwj.service.impl.AccountServiceImpl2">
<property name="birthday" ref="now"></property>
</bean>
3.复杂类型和集合类型
<bean id="accountService3" class="com.xwj.service.impl.AccountServiceImpl3">
<property name="myStrs" >
<array>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</array>
</property>
<property name="myList" >
<list>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</list>
</property>
<property name="mySet" >
<set>
<value>AAA</value>
<value>BB</value>
<value>C</value>
</set>
</property>
<property name="myMap" >
<map>
<entry key="testA" value="AAA"></entry>
</map>
</property>
<property name="myPros" >
<props>
<prop key="testA">ccc</prop>
<prop key="testB">bbb</prop>
</props>
</property>
</bean>
使用注解注入常见的注解
1.@Component(value="指定id")
- 作用:把当前类对象存入到Spring容器中。
- 常见的继承类有@Service,@Controller,@Repository
2.用于注入数据:
- Autowired
- 作用:自动按照类型注入,当容器中有唯一的bean对象类型和要注入的变量类型匹配,就可以注入成功。
- 出现的位置:变量、方法
- @Qualifier
- 作用:在按照类型注入的基础上,在按照名称注入,不能单独给类成员实现注入,但可以给方法参数实现注入
- 属性:value:用于指定注入bean的id
- @Resource
- 作用:直接按照bean的id注入,可以单独使用
- 属性:name:用于指定bean的id
- 以上的三个注解只能对其他的bean类型实现注入,基本类型和String无法使用上述注解实现注入,复杂类型和集合类型必须使用XML实现
- @Value
- 作用:用于注入基本类型和String类型的数据
- 属性:value:用于指定数据的值
- @Scope
- 作用:用于指定bean的作用范围
- 属性:value :singleton(单例),prototype(多例)