applicationContext.xml 文件
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
autowire属性值有 不推荐使用
byName 根据Bean定义时的“id"属性上指定的别名与Setter名称是否一致进行自动装配
byType 根据PoJo的setXXX()方法所接受的类型判断bean定义文件是否定义有类似的类型对象进行自动装配
constructor Spring容器比对容器中的Bean实例类型及相关的构造方法上的参数类型是否符合进行自动装配
autodetect 先进行constructor自动装配,若缺省,则进行byType自动装配
no不进行自动装配
depends-on
若A depends-on B 意思是实例化A之前必须先实例化B,但A不需要持有B的实例
abstract属性值
false默认
ture表示抽象Bean,ApplicationContext预初始化时忽略所有抽象Bean定义
parent 表示该Bean为子Bean,其值指向父Bean,重用父Bean已实现的依赖
dependency-check属性值
simple 只检查简单的属性是否完成依赖关系
objects 检查对象类型的属性是否完成依赖关系
all检查全部的属性是否完成依赖关系
none默认值,表示不检查依赖性
singleton属性值指定此Java Bean是否采用单例(Singleton)模式
false则通过BeanFactory获取此Java Bean实例时,BeanFactory每次都将创建一个新的实例返回。
true(默认) 则在BeanFactory作用范围内,只维护此Java Bean的一个实例,代码通过BeanFactory获得此Java Bean实例的引用。
init-method 初始化方法,此方法将在BeanFactory创建JavaBean实例和属性set注入之后,在向应用层返回引用之前执行。一般用于一些资源的初始化工作。
destroy-method 销毁方法。此方法将在BeanFactory销毁的时候执行,一般用于资源释放。
lazy-init属性值
true 延迟加载,也就是IoC 容器将第一次被用到时才开始实例化
false默认
factory-bean通过实例工厂方法创建bean,class属性必须为空,factory-bean属性必须指定一个bean的名字,这个bean一定要在当前的bean工厂或者父bean工厂中,并包含工厂方法。而工厂方法本身通过factory-method属性设置。
factory-method 定义工厂方法,若是class属性指向工厂类,该工厂类包含的工厂方法须是static
scope属性值
scope可以取值:
* singleton:每次调用getBean的时候返回相同的实例.这个是默认,也就是单实例
* prototype:每次调用getBean的时候返回不同的实例.这个是多实例
还可取值request、session、global session等(不常用)
具体的用法如下
<bean id="userDao" class="com.test.dao.impl.UserDAOImpl" scope="singleton"/>
<bean id="userService" class="com.test.service.impl.UserServiceImpl" scope="prototype">
<property name="userDao" ref="userDao"/>
</bean>
这个怎么需要看你具体的时机...如果你的bean是无状态的.那么单实例就可以了...如果Bean是有状态的,那么你最好设置成多实例的.因为这样可以解决线程安全问题.
id: Bean的唯一标识名。它必须是合法的XML ID,在整个XML文档中唯一。
name: 用来为id创建一个或多个别名。它可以是任意的字母符合。多个别名之间用逗号或空格分开。
class: 用来定义类的全限定名(包名+类名)。只有子类Bean不用定义该属性
在类上 ,使用以下注解,实现bean 的声明
@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
@Service 用于标注业务层组件(服务层)
@Controller 用于标注控制层组件(如srping mvc的controller,struts中的action)(控制层)
@Repository 用于标注数据访问组件,即DAO组件(持久层)
示例:
@Controller
@RequestMapping(value = "/test")
public class TestController {
}
注册后bean名称为testController
或者
@Controller(“myController”)
@RequestMapping(value = "/test")
public class TestController {
}
注册后bean名称为 myController
------------------------------------------------------------------------------------------------------------------
在类的成员变量上,使用以下注解,实现属性的自动装配
@Autowired : 按类 的 类型进行装配,
如果想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:
public class TestServiceImpl {
@Autowired
@Qualifier("userDao")
private UserDao userDao;
}
在找不到相关类型,会抛出异常,可以使用@
Autowired(required=false)来屏蔽异常,但每个类只有一个构造器可以标记为true,也可以使用@required来代替
@Resource (推荐)
@Resource注解在字段上,这样就不用写setter方法了,并且这个注解是属于J2EE的,减少了与spring的耦合。
最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。
@Resource(JSR-250标准注解,推荐使用它来代替Spring专有的@Autowired注解)Spring 不但支持自己定义的@Autowired注解,还支持几个由JSR-250规范定义的注解,它们分别是@Resource、@PostConstruct以及@PreDestroy。
@Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按byName自动注入罢了。@Resource有两个属性是比较重要的,分别是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略
@Resource装配顺序
1 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
2 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
3 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
4 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配(见2);如果没有匹配,则回退为一个原始类型(UserDao)进行匹配,如果匹配则自动装配;
示例:
@Resource
private TestServiceImpl testServiceImpl;
或
public class TestServiceImpl {
// 下面两种@Resource只要使用一种即可
@Resource(name="userDao")
private UserDao userDao; // 用于字段上
@Resource(name="userDao")
public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
this.userDao = userDao;
}
}
3. @PostConstruct(JSR-250)
在方法上加上注解 @PostConstruct ,这个方法就会在 Bean 初始化之后被 Spring 容器执行(注: Bean 初始化包括,实例化 Bean ,并装配 Bean 的属性(依赖注入))。
它的一个典型的应用场景是,当你需要往 Bean 里注入一个其父类中定义的属性,而你又无法复写父类的属性或属性的 setter 方法时,如:
cop } }
- public class UserDaoImpl extends HibernateDaoSupport implements UserDao {
- private SessionFactory mySessionFacotry;
- @Resource
- public void setMySessionFacotry(SessionFactory sessionFacotry) {
- this.mySessionFacotry = sessionFacotry;
- }
- @PostConstruct
- public void injectSessionFactory() {
- super.setSessionFactory(mySessionFacotry);
- }
这里通过@PostConstruct,为UserDaoImpl的父类里定义的一个sessionFactory私有属性,注入了我们自己定义的sessionFactory(父类的setSessionFactory方法为final,不可复写),之后我们就可以通过调用super.getSessionFactory()来访问该属性了。
在方法上加上注解 @PreDestroy ,这个方法就会在 Bean 初始化之后被 Spring 容器执行。由于我们当前还没有需要用到它的场景,这里不不去演示。其用法同 @PostConstruct 。
5.@PreDestroy(JSR-330)
需要引入javax.inject包
maven引入方式:
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
@Inject等同与@AutoWired
@Named等同与@Component,也可以使用name属性进行特定名称的依赖注入(使用情况:一个bean有两个实例)
在bean上还可以添加其他注解
@scope 作用域,有以下5种属性
- singleton 表示在spring容器中的单例,通过spring容器获得该bean时总是返回唯一的实例,不用容器的bean不是同一个
- prototype表示每次获得bean都会生成一个新的对象
- request表示在一次http请求内有效(只适用于web应用)
- session表示在一个用户会话内有效(只适用于web应用)
- globalSession表示在全局会话内有效(只适用于web应用)
@Configuration
@Bean
@Import
@DependsOn