Spring——IOC(四)

来源:互联网 发布:韩日军力对比知乎 编辑:程序博客网 时间:2024/04/19 04:50

九、Annotation——AutoWiredQualifier

配置文件如下:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

           http://www.springframework.org/schema/context

http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config></context:annotation-config>

  <bean id="u" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="userService" class="com.zgy.service.UserService" >

  </bean>

</beans>

 

 

以下的这段配置配上了以后,其实就已经实例化了如下的4bean<context:annotation-config></context:annotation-config>

AutowiredAnnotationBeanPostProcessorCommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,  RequiredAnnotationBeanPostProcessor

使用以上的配置之后,还需要在对应的setter方法上加入对应的Annotation

package com.zgy.service;

 

import org.springframework.beans.factory.annotation.Autowired;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

 

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

 

public UserDAO getUserDAO() {

return userDAO;

}

@Autowired

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

运行测试程序后,观察结果:

user saved

以上的Annotation配置与XML中的 autowire="byType"的配置作用相同。

如果想实现相当于XML中 autowire="byName"的效果,可以使用如下方法:

增加@Qualifier("u2")注解

实验:

1)修改UserService

package com.zgy.service;

 

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Qualifier;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

 

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

 

public UserDAO getUserDAO() {

return userDAO;

}

@Autowired

public void setUserDAO(@Qualifier("u2")UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

 

(2)在配置文件中增加一个bean

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd         http://www.springframework.org/schema/context          http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config></context:annotation-config>

  <bean id="u" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="u2" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="userService" class="com.zgy.service.UserService">

  </bean>

</beans>

(3)测试,观察结果:

user saved


十、Annotation——Resource

使用@Resource这个注解也可以实现注入。实现如下:

(1)在方法上加上@Resource

package com.zgy.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Qualifier;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

public UserDAO getUserDAO() {

return userDAO;

}

@Resource

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

(2)在配置文件中配置一个bean

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

           http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config></context:annotation-config>

  <bean id="u" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="userService" class="com.zgy.service.UserService">

  </bean>

  </beans>

(3)测试

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

import com.zgy.service.UserService;

 

 

public class UserServiceTest {

 

@Test

public void testAdd() throws Exception {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserService userService= (UserService) applicationContext.getBean("userService");

userService.add(new User());

}

 

}

(4)结论:@Resource默认是按照类型来注入的。当存在两个相同类型的bean的时候,@Resource需要加上额外的name属性指明使用的是哪一个bean

(5)范例:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

           http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config></context:annotation-config>

  <bean id="u" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="u2" class="com.zgy.impl.UserDAOImpl">

  </bean>

  <bean id="userService" class="com.zgy.service.UserService">

  </bean>

  </beans>

(6)此时需要在@Resource(name="u")用来指定是用的是名字为u的这个bean

package com.zgy.service;

 

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Qualifier;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

 

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

 

public UserDAO getUserDAO() {

return userDAO;

}

@Resource(name="u")

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

 

 

 

十一、Annotation——Component

在配置文件中可以不明确的写出需要注入的bean,而是通过<context:component-scan base-package="包路径" />的形式让Spring自动所有包下的符合注入条件的bean

实验:

(1)修改配置文件

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

       xmlns:context="http://www.springframework.org/schema/context"

       xsi:schemaLocation="http://www.springframework.org/schema/beans

           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd

           http://www.springframework.org/schema/context

           http://www.springframework.org/schema/context/spring-context-2.5.xsd">

<context:annotation-config></context:annotation-config>

<context:component-scan base-package="com.zgy" />

  <bean id="userService" class="com.zgy.service.UserService">

  </bean>

</beans>

(2)在UserDAOImpl中添加@Component注解

package com.zgy.impl;

import org.springframework.stereotype.Component;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

@Component

public class UserDAOImpl implements UserDAO{

@Override

public void save(User u) {

System.out.println("user saved");

}

}

 

(3)在UserService中添加@Resource

package com.zgy.service;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Qualifier;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

 

public class UserService {

private UserDAO userDAO;

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

public UserDAO getUserDAO() {

return userDAO;

}

@Resource

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

public void destory(){

System.out.println("destroy");

}

}

 

(4)测试:

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

import com.zgy.service.UserService;

public class UserServiceTest {

@Test

public void testAdd() throws Exception {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserService userService= (UserService) applicationContext.getBean("userService");

userService.add(new User());

}

}

 

(5)结论:

userService这个bean中的属性UserDAO属性,由于配置文件中没有配置该属性,所以会根据<context:component-scan base-package="com.zgy" />在com.zgy的包名下进行搜索,当找到@Component时,即找到了适合的信息

(6)也可以通过@Component(value="u")和Resource(name="u")的形式指定名称。

 

 

 

十二、Annotation——@Scope,@PostConstruct,@PreDestroy

@Scope作用是限制bean的生存范围,常用的取值有singletonprototype

 

@PostConstruct定义初始化方法

@PreDestory定义销毁方法

范例:

(1)UserService.java

package com.zgy.service;

 

import javax.annotation.PostConstruct;

import javax.annotation.PreDestroy;

import javax.annotation.Resource;

import org.springframework.beans.factory.annotation.Qualifier;

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Component;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

@Component

@Scope("prototype")

public class UserService {

private UserDAO userDAO;

@PostConstruct

public void init(){

System.out.println("init");

}

public void add(User u){

this.userDAO.save(u);

}

 

public UserDAO getUserDAO() {

return userDAO;

}

@Resource(name="u")

public void setUserDAO(UserDAO userDAO) {

this.userDAO = userDAO;

}

@PreDestroy

public void destory(){

System.out.println("destroy");

}

}

 

(2)UserDAOImpl.java

package com.zgy.impl;

 

import org.springframework.context.annotation.Scope;

import org.springframework.stereotype.Component;

 

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

@Component(value="u")

@Scope("prototype")

public class UserDAOImpl implements UserDAO{

 

 

@Override

public void save(User u) {

System.out.println("user saved");

}

}

 

(3)测试:

package com.bjsxt.service;

import org.junit.Test;

import org.springframework.context.ApplicationContext;

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.zgy.dao.UserDAO;

import com.zgy.model.User;

import com.zgy.service.UserService;

 

 

public class UserServiceTest {

 

@Test

public void testAdd() throws Exception {

ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("beans.xml");

UserService userService= (UserService) applicationContext.getBean("userService");

UserService userService2= (UserService) applicationContext.getBean("userService");

System.out.println(userService == userService2);

userService.add(new User());

applicationContext.destroy();

}

}




0 0
原创粉丝点击