原文链接: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,CommonAnnotationBeanPostProcessorPersistenceAnnotationBeanPostProcessor,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声明在销毁时运行的方法

Spring(四)注解配置Ioc的更多相关文章

  1. java框架之Spring(2)-注解配置IOC&AOP配置

    注解配置IoC 准备 1.要使用注解方式配置 IoC,除了之前引入的基础 jar 包,还需要引入 spring-aop 支持包,如下: 2.在 applicationContext.xml 中引入 c ...

  2. JavaWeb_(Spring框架)注解配置

    系列博文 JavaWeb_(Spring框架)xml配置文件  传送门 JavaWeb_(Spring框架)注解配置 传送门 Spring注解配置 a)导包和约束:基本包.aop包+context约束 ...

  3. Spring详解(四)------注解配置IOC、DI

    Annotation(注解)是JDK1.5及以后版本引入的.它可以用于创建文档,跟踪代码中的依赖性,甚至执行基本编译时检查.注解是以‘@注解名’在代码中存在的. 前面讲解 IOC 和 DI 都是通过 ...

  4. Spring自定义注解配置切面实现日志记录

    一: spring-mvc.xml: <!--配置日志切面 start,必须与mvc配置在同一个配置文件,否则无法切入Controller层--><!-- 声明自动为spring容器 ...

  5. spring基于注解的IoC以及IoC的案例

    1.Spring中IoC的常用注解 1.1明确: (1)基于注解的配置和xml的配置要实现的功能都是一样的,都是要降低程序之间的耦合,只是配置的形式不一样 2.案例:使用xml方式和注解方式实现单表的 ...

  6. spring aop注解配置

    spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...

  7. Spring的注解配置与XML配置之间的比较

    注释配置相对于 XML 配置具有很多的优势: 它可以充分利用 Java 的反射机制获取类结构信息,这些信息可以有效减少配置的工作. 如:使用 JPA 注释配置 ORM 映射时,我们就不需要指定 PO ...

  8. Spring纯注解配置

    待改造的问题 我们发现,之所以我们现在离不开 xml 配置文件,是因为我们有一句很关键的配置: <!-- 告知spring框架在,读取配置文件,创建容器时,扫描注解,依据注解创建对象,并存入容器 ...

  9. Spring详解(二)------注解配置IOC

    @Configuration:告诉Spring这是一个配置类 @Bean("person")-->作用于方法:给容器中注册一个Bean;类型为返回值的类型 @Componen ...

随机推荐

  1. Flask下如何处理Requests 上传中文文件名的问题

    一.问题的由来     最近有个项目,叫做文档服务资源中心,类似于七牛,为各个业务系统提供统一的文件资源服务,包括文件的存储.操作管理.下载.预览等.在做文件存储的时候,遇到了这个当指定上传的文件名为 ...

  2. elasticsearch完全匹配

    $params = array( "body" => array( "query" => array( "filtered" = ...

  3. <十四>JDBC_c3p0数据库连接池

    配置文件:c3p0-config.xml <!-- Hibernate官方推荐使用的数据库连接池即c3p0;dbcp是Tomcat在数据源中使用 --><c3p0-config> ...

  4. 初学者-PHP笔记

    PHP介绍 PHP 是 "PHP Hypertext Preprocessor" 的首字母缩略词 PHP 是一种被广泛使用的开源脚本语言 PHP 脚本在服务器上执行 PHP 没有成 ...

  5. *HDU1907 博弈

    John Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submis ...

  6. 深入理解css BFC 模型

    如果要深入理解css布局的各种原理,要在重构页面做得心应手的话,那么你就必须先理解这玩意 "BFC" , BlockFormatting Context(块级格式化上下文): 这里 ...

  7. SQL 存储过程 传入数组参数

    今天在做统计数据的时候,传入数组导致数据不显示.解决方式和大家分享一下: --参数@CompanyName='北京,天津,上海' DECLARE @PointerPrev int     DECLAR ...

  8. Javascript初学篇章_7(DOM)

    DOM 文档对象模型DOM (document object model) 文档对象模型,它定义了操作文档对象的接口.DOM 把一份html文档表示为一棵家谱树,使用parent(父), child( ...

  9. .net网站常见问题及解决方案

    1.   解决方法: 三个文件放到项目Bin文件夹     2. 解决方法 : requestValidationMode="2.0" 加到 3. 你在浏览器输入网址报这样的错误 ...

  10. Spring MVC注解的一些案列

    1.  spring MVC-annotation(注解)的配置文件ApplicationContext.xml <?xml version="1.0" encoding=& ...