java学习之路----spring探索2---注解

原创 2013年12月01日 22:35:36
前面章节:

开始学习注解

1.首先我们来修改我们的beans

<?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-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd">
     
     <!-- 这里必须写这个才能注入成功 -->
     <context:annotation-config />
     <bean name="userDAO" class="com.test.dao.impl.UserDAOImpl" >
           <property name= "daoId" value ="1"></ property>
     </bean >


     <bean id="userService" class="com.test.service.UserService" >
           <!-- <property name="userDAO" bean="u" />修改为下面的样子 -->
          <!-- <property name= "userDAO" ref = "userDAO" /> -->
     </bean >


</beans>   


2. <context:annotation-config />的作用


记住这些就是用来处理我们注解的bean

3.autowired(通过byType来注入的)   注入
public class UserService {
     
      private UserDAO userDAO; 
    
      public UserDAO getUserDAO() {
           return userDAO ;
     }
      @Autowired
      public void setUserDAO(UserDAO userDAO) {
           this .userDAO = userDAO;
     }

      public void addUser(User user ){
           userDAO.save(user);
          
     };

}
 最好写在setter 上面,如果写在 private UserDAO userDAO;上面,破换封装性

4.@Resource(默认是byName方法来注入)注入

public class UserService {
     
      private UserDAO userDAO; //现在是这样,通过配置文件来实例化
   
      public UserDAO getUserDAO() {
           return userDAO ;
     }
      @Resource
      public void setUserDAO(UserDAO userDAO) {
           this .userDAO = userDAO;
     }

      public void addUser(User user ){
           userDAO.save(user);
          
     };

}



推荐使用@Resource

5.component(组件)注解

在spring 中如果不想自己写bean,也可以用组件来让spring 为你写

代码:
          在userDAOImpl 上加一个组件注解

@Component
public class UserDAOImpl implements UserDAO{
      private int daoId ;
     
     
      public int getDaoId() {
           return daoId ;
     }
      public void setDaoId( int daoId) {
           this .daoId = daoId;
     }

      @Override
      public void save(User u) {
          
          System. out .println("save user" + this. daoId);
     }

}

修改beans
<? 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-3.0.xsd
         http://www.springframework.org/schema/context
         http://www.springframework.org/schema/context/spring-context-3.0.xsd" >
     
      <!-- 这里必须写这个才能输入成功 -->
      <context:annotation-config />
      <context:component-scan base-package= "com.test" />

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


</ beans>

这里只有 userService 了,没有dao的bean了


然后我们来运行一下

结果一样


从结果中我们发现,虽然我们没有写dao的bean,但是spring帮我们写了。。。

我们这里说一下spring的写了的过程

               首先加载beans.xml ,发现有<context:annotation-config />
      <context:component-scan base-package= "com.test" />
                  然后spring就会去扫描我们给他定好的包base-package= "com.test"
                  扫描到UserDAOImpl 的时候,发现有compont组件,就会把这个组件存到容器里面去(键值对的形式)key(名字)userDAOImpl(就是把首字母小写) ,值就是实例对象,然后继续,发现resource这个注入注解,就会按名称把这个注入进来




如果要使用我们的名字
代码:

@Component (value="userDao" )//这里我们名字为userDao
public class UserDAOImpl implements UserDAO{

     
      private int daoId ;
     
     
      public int getDaoId() {
           return daoId ;
     }


      public void setDaoId( int daoId) {
           this .daoId = daoId;
     }


      @Override
      public void save(User u) {
          
          System. out .println("save user" + this. daoId);
     }

}

public class UserService {
      //private UserDAO userDao=new UserDAOImpl();原来是这样的
     
      private UserDAO userDAO; //现在是这样,通过配置文件来实例化
     
      public UserDAO getUserDAO() {
           return userDAO ;
     }
      @Resource(name= "userDao" )//这里注入的时候去通过名字来取实例,所以也要叫userDao
      public void setUserDAO(UserDAO userDAO) {
           this .userDAO = userDAO;
     }

      public void addUser(User user ){
           userDAO.save(user);
          
     };

}

运行结果:
save user0

如果我们的给的名字不一样,会发生什么喃?
@Resource (name= "userDAO")//我把名字改为大写

我们来看下结果:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userService': 
我直截取了第一句,意思就是bean工厂创建错误,意思就是没有这个userDao,而去创建了userDAO,所以会报这个错误

我觉得写上名字好些


这里补充一点component的知识

Spring 2.5 中除了提供 @Component 注释外,还定义了几个拥有特殊语义的注释,它们分别是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,这 3 个注释和 @Component 是等效的,但是从注释类的命名上,很容易看出这 3 个注释分别和持久层、业务层和控制层(Web 层)相对应。虽然目前这 3 个注释和 @Component 相比没有什么新意,但 Spring 将在以后的版本中为它们添加特殊的功能。所以,如果 Web 应用程序采用了经典的三层分层结构的话,最好在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释,而用 @Component 对那些比较中立的类进行注释。

在 一个稍大的项目中,通常会有上百个组件,如果这些组件采用xml的bean定义来配置,显然会增加配置文件的体积,查找以及维护起来也不太方便。 Spring2.5为我们引入了组件自动扫描机制,他可以在类路径底下寻找标注了 @Component,@Service,@Controller,@Repository注解的类,并把这些类纳入进spring容器中管理。它的作用 和在xml文件中使用bean节点配置组件时一样的。要使用自动扫描机制,我们需要打开以下配置信息: 
Java代码

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"  
2. >  
3.   
4. <context:component-scan base-package=”com.eric.spring”>   
5. </beans>   
   /*其中base-package为需要扫描的包(含所有子包)
     @Service用于标注业务层组件,
     @Controller用于标注控制层组件(如struts中的action),
     @Repository用于标注数据访问组件,即DAO组件,
     @Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。
    */   

注入方式:

把 DAO实现类注入到service实现类中,把service的接口(注意不要是service的实现类)注入到action中,注入时不要new 这个注入的类,因为spring会自动注入,如果手动再new的话会出现错误,然后属性加上@Autowired后不需要getter()和 setter()方法,Spring也会自动注入。至于更具体的内容,等对注入的方式更加熟练后会做个完整的例子上来。

注解:
在 spring的配置文件里面只需要加上<context:annotation-config/> 和<context:component-scan base-package="需要实现注入的类所在包"/>,可以使用base-package="*"表示全部的类。   

<context:component-scan base-package=”com.eric.spring”> 

其中base-package为需要扫描的包(含所有子包)
在接口前面标上@Autowired和@Qualifier注释使得接口可以被容器注入,当接口存在两个实现类的时候必须指定其中一个来注入,使用实现类首字母小写的字符串来注入。

@Service服务层组件,用于标注业务层组件,表示定义一个bean,自动根据bean的类名实例化一个首写字母为小写的bean,例如Chinese实例化为chinese,如果需要自己改名字则:@Service("你自己改的bean名")。   

@Controller用于标注控制层组件(如struts中的action)

@Repository持久层组件,用于标注数据访问组件,即DAO组件

@Component泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。 



6.那controller有什么作用喃?它有不需要new,注解它到底为了什么喃?

                 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示。在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注解用以定义URL 请求和Controller 方法之间的映射,这样的Controller 就能被外界访问到。此外Controller 不会直接依赖于HttpServletRequest和HttpServletResponse 等HttpServlet 对象,它们可以通过Controller 的方法参数灵活的获取到。

          在struts中Controller:控制器的作用是从客户端接受请求,并且选择执行相应的业务逻辑,然后把响应结果送回到客户端。在Struts中Controller功能由ActionServlet和ActionMapping对象构成:核心是一个Servlet类型的对象ActionServlet,它用来接受客户端的请求。ActionServlet包括一组基于配置的ActionMapping对象,每个ActionMapping对象实现了一个请求到一个具体的Model部分中Action处理器对象之间的映射。



版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

学习spring mvc 之路二 spring mvc 里的一些注解

我是接着上一节来继续写的;一些新的注解 @RequestMapping("/springmvc") @Controller public class SptringMVCTest { priv...

Java成长之路-2(深入Spring-IOC)

前文简单介绍了Spring是什么,本文将深入IOC,首先介绍使用IOC的两种方法,紧接着深入Spring挖掘IOC的工作原理。 我的开发环境:JDK 1.8;Intellij IDEA 2017 ...

菜鸟之路——Spring MVC(九)常用注解

抛开长长的xml文件,注解能解放我们的双手。我们就一起来看看Spring MVC 4中常用的那些注解。   spring开启注解的配置如下,先需在XML头文件下引入 spring-context,然后...
  • sjjsh2
  • sjjsh2
  • 2016年11月08日 15:18
  • 1640

【SSH进阶之路】Spring的AOP逐层深入——采用注解完成AOP(七)

采用注解方式,实现AOP,解析五类Advice的执行顺序。

Spring进阶之路(12)-注解方式实现Bean的注入

鉴于之前的博文中都是通过在xml中对bean进行配置的方式注入的,又加上博友的要求,决定对注解方式进行一个简单的讲解,这里不会涉及太复杂的程序,因为本文的目的是让看到这篇博文的广大博友能懂,而不是云里...

Java和J2EE的学习之路

  • 2008年05月10日 22:22
  • 14KB
  • 下载

【SSH进阶之路】【十】hibernate5 注解映射【2】 一对多单向关联

在上一篇文章里,我们从端方向一端建立关联关系,完成了从文章到作者的关联关系建立,但在实际的博客网站中,用户肯定还需要获取自己所写的文章,这时可以建立用户(一)对文章(多)的单向关联映射。 先来看我们的...

【SSH进阶之路】【五】hibernate5 实体映射注解配置 【2】主键生成策略

@GeneratedValue基本注解类型在上一篇文章中,我们讲到了JPA使用@GeneratedValue注解来定义生成策略,而关于注解生成策略有4种基本支持类型: 1. GenerationT...

java架构师、集群、高可扩展、高性能、高并发、性能优化、Spring boot、Dubbo、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路

java架构师、集群、高可扩展、高性能、高并发、性能优化、Spring boot、Dubbo、Redis、ActiveMQ、Nginx、Mycat、Netty、Jvm大型分布式项目实战学习架构师之路 ...

【Java 安全技术探索之路系列:J2SE安全架构】之六:安全管理工具

作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWel...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:java学习之路----spring探索2---注解
举报原因:
原因补充:

(最多只允许输入30个字)