• 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声明在销毁时运行的方法

  • 相关阅读:
    appfabric cache配置,实验记录
    appfabric cache存储ef 查询结果的bug
    CruiseControl.NET svn获取 自动编译 ftp上传
    @Ajax.RenderAction 把局部页改为ajax加载
    分布式架构下的mvc 异步controller ajax comet 长连接
    win7重装iis,搞死
    验证码识别的基本思路及方法
    C# 获取程序当前文件夹
    在c#中 限制文本框只能输入数字
    string字符串 获取指定位置范围的子字符串
  • 原文地址:https://www.cnblogs.com/orlion/p/5350863.html
Copyright © 2020-2023  润新知