zoukankan      html  css  js  c++  java
  • 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声明在销毁时运行的方法

  • 相关阅读:
    tomcat日志切割脚本
    开源项目推荐:GSL科学计算函数库(GNU Scientific Library),实现VS2019源码编译
    MCUXpresso环境开发(本文争取做到您能够快速简易应用入门,知道大体流程,复杂功能和窗口设置一律不管)
    Arduino uno r3 使用 ESP8266 UARTWiFi 透传模块
    ESP8266引脚的说明
    windows10安装Trading View出错解决办法
    windows or linux 64位安装talib包
    python中list数组指定类型
    面试官问我JVM调优,我忍不住了!
    稳了!我准备了1个晚上的CMS垃圾收集器
  • 原文地址:https://www.cnblogs.com/orlion/p/5350863.html
Copyright © 2011-2022 走看看