Spring(四)注解配置Ioc

原文链接:http://www.orlion.ga/216/

一、@Autowired

beans.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"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userService" class="ml.orlion.service.UserService">
    </bean>
</beans>

当我们在配置文件中配置了<context:annotation-config/>时,spring会自动帮我们初始化四个bean(AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor, PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor)来处理我们在代码中的注解

 

然后UserService.java:

代码中的注解@Autowired默认是byType,所以beans.xml中不能出现两个类型相同的bean,因为如果类型一致spring就不知道应该注入哪一个了。

package ml.orlion.service;

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

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

    private UserDAO userDAO = new UserDAOImpl();

    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}

测试一下

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

输出saving user,即成功调用了UserDAOImpl中的save方法

 

上边的代码有一个限制就是beans.xml中一个类只能配置一个bean,比如beans.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"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
    <bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl">
    </bean>
    
    <bean id="userService" class="ml.orlion.service.UserService">
    </bean>
</beans>

这时候可以把UserService类改成如下(在setUserService方法中加注解)

package ml.orlion.service;

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

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

    private UserDAO userDAO = new UserDAOImpl();

    public UserDAO getUserDao() {
        
        return userDAO;
    }
    @Autowired
    public void setUserDao(@Qualifier("userDao") UserDAO userDAO) {
        this.userDAO = userDAO;
    }
    
    public void saveUser(User user){
        this.userDAO.saveUser(user);
    }
}

这时候再运行就不会报错了。

二、@Reosource

从bean容器中注入bean,默认是按名字查找,找不到再按类型,可以指定名字

 

beans.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"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
   
	<bean id="userDao" class="ml.orlion.dao.impl.UserDAOImpl">
	</bean>
	
	<bean id="userDao1" class="ml.orlion.dao.impl.UserDAOImpl">
	</bean>
	
	<bean id="userService" class="ml.orlion.service.UserService">
	</bean>
</beans>

UserService.java:

package ml.orlion.service;

import javax.annotation.Resource;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;

public class UserService {

	private UserDAO userDAO = new UserDAOImpl();

	public UserDAO getUserDao() {
		
		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}

测试可以运行会输出saving user

 

三、@Component

将一个类声明为spring的bean

beans.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"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context.xsd">

   <context:annotation-config/>
   <context:component-scan base-package="ml.orlion"></context:component-scan>
   
</beans>

其中<context:component-scan base-package="ml.orlion"></context:component-scan>表示从包名为ml.orlion下的所有类中找Component.

UserDAOImpl.java

package ml.orlion.dao.impl;

import org.springframework.stereotype.Component;

import ml.orlion.dao.UserDAO;
import ml.orlion.model.User;
@Component("userDao") //默认名字是userDaoImpl
public class UserDAOImpl implements UserDAO{

	public void saveUser(User user){
		System.out.println("save usering");
	}
}

UserService.java

package ml.orlion.service;

import javax.annotation.Resource;

import org.springframework.stereotype.Component;

import ml.orlion.dao.UserDAO;
import ml.orlion.dao.impl.UserDAOImpl;
import ml.orlion.model.User;
@Component("userService")
public class UserService {

	private UserDAO userDAO = new UserDAOImpl();

	public UserDAO getUserDao() {
		
		return userDAO;
	}
	@Resource(name="userDao")
	public void setUserDao(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
	public void saveUser(User user){
		this.userDAO.saveUser(user);
	}
}

测试一下:

BeanFactory appContext = new ClassPathXmlApplicationContext("beans.xml");
UserService userService = (UserService) appContext.getBean("userService");
userService.saveUser(new User());

运行会输出saving user

 

四、@Scope、@PostConstruct、@PreDestroy

可以在类定义之前添加注释@Scope("prototype")将bean声明为每次调用时都重新new一个。

@PostConstructbean声明在初始化时运行的方法

@PreDestroy声明在销毁时运行的方法

posted @ 2016-04-03 21:45  orlion  阅读(313)  评论(0编辑  收藏  举报