博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring的注解注入
阅读量:6762 次
发布时间:2019-06-26

本文共 4453 字,大约阅读时间需要 14 分钟。

hot3.png

以前在使用spring是通过xml来注入的,每次增加一个service 或 dao都要修改xml 文件,现在也赶时髦用注解来实现。

 手工装配依赖对象,在这种方式中又有两种编程方式

  1. 在xml配置文件中,通过在bean节点下配置,如
   <bean id="orderService" class="cn.itcast.service.OrderServiceBean"> <constructor-arg index=“0” type=“java.lang.String” value=“***”/>//构造器注入 <property name=“name” value=“zhao/>//属性setter方法注入 </bean>
第一种方式是在XML里注入的,这有什么不好地方呢?如果我们是在xml文件里进行注入的话,如果bean多的话,那么xml配置文件会很臃肿。 所以Spring在2.0和2.5的时候都给我们提供了一个减肥的方案,就是采用注解的方式来减轻配置文件臃肿的程度。

 

2. 在java代码中使用@Autowired或@Resource注解方式进行装配。

第一步:在applicationContext.xml进行相应的配置

以下命名空间的配置隐 式注册了多个对注释进行解析处理的处理 器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor.

  每个处理器都对应一些注解,好比AutowiredAnnotationBeanPostProcessor这个处理器专门用来解 析@Autowired这个注解的。CommonAnnotationBeanPostProcessor这个处理器专门用来解析@Resource这个 注解的;PersistenceAnnotationBeanPostProcessor这个处理器用来处理持久化方面的注解;。。。。。每个处理器都处 理相应的注解
  大家一定要注意一点:注解的本身和XML作用都是一样,用于配置的,它本身并不能干活。 它之所以能干活,是因为在它的背后有这些处理器处理

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="" xmlns:xsi=""
    xmlns:jee="
" xmlns:tx=""
    xmlns:context="
"
    xsi:schemaLocation="
"
    default-lazy-init="true">
    <description>Spring公共配置文件</description>

    <!-- 使用annotation 自动注册bean,并保证@Required,@Autowired的属性被注入 -->

    <context:component-scan base-package="com.jweb" />

    <!-- 数据源配置,在开发测试环境直连数据库 -->

    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="url" value="jdbc:mysql://localhost:3306/mshop" />
        <property name="username" value="root" />
        <property name="password" value="mysql" />
    </bean>

    <!-- Hibernate配置 -->
    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="namingStrategy">
            <bean class="org.hibernate.cfg.ImprovedNamingStrategy" />
        </property>
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
            </props>
        </property>
        <property name="packagesToScan" value="com.jweb.entity.*" />
    </bean>

    <bean id="hibernateTemplate" class="org.springframework.orm.hibernate3.HibernateTemplate">

        <property name="sessionFactory">
            <ref bean="sessionFactory" />
        </property>
    </bean>

    <!-- 事务管理器配置,单数据源事务 -->

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory" />
    </bean>
   
    <!-- 使用annotation定义事务 -->
    <tx:annotation-driven transaction-manager="transactionManager" />

</beans>

这一步关键是就是红色标识的地方。

第二步:在service及dao上使用注解说明这个组件是service还是dao

package com.jweb.service.user;

import java.util.List;

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

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jweb.dao.user.UserDao;

import com.jweb.entity.user.User;

@Transactional
public class UserService {

   @Autowired

    private UserDao mdao;

   

    public UserDao getMdao() {
        return mdao;
    }

    public void setMdao(UserDao mdao) {
        this.mdao = mdao;
    }

    public List<User> findAll(){
        return mdao.findAll();
    }
   
}

package com.jweb.dao.user;

import java.util.List;

import org.hibernate.SessionFactory;

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

import com.jweb.entity.user.User;

@Repository

public class UserDao {
    private SessionFactory sessionFactory;

    public SessionFactory getSessionFactory() {

        return sessionFactory;
    }

//在这里也可以直接注入配置的hibernateTemplate

    @Autowired

    public void setSessionFactory(SessionFactory sessionFactory) {
        this.sessionFactory = sessionFactory;
    }
   
    @SuppressWarnings("unchecked")
    public List<User> findAll(){
        return sessionFactory.getCurrentSession().createQuery("from User").list();
    }
}

用@service和@Repository只是明确的标识这个是什么类型的类,当然也可以用@Component来标识这个是一个可以注入的组件类。

这样就不在需要在xml文件中配置大量的bean了,是比较方便。

在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

//Resource这个注解包的前缀是javax,这是J2EE提供的一个注解,这个注解不属于Spring的 //以后在使用注解方式注入对象的时候建议大家使用这个注解,而不要使用@Autowired注解 //@Autowired是Spring提供的; @Resource是J2EE提供的,在JDK1.6里就存在了 //这两个注解作用都一样,@Resource不属于Spring的,所以她没有跟框架紧密耦合,所以推荐大家使用这个

转载于:https://my.oschina.net/lzwenme/blog/269765

你可能感兴趣的文章
经典算法-链表(golang)
查看>>
leetcode — search-a-2d-matrix
查看>>
魔板 bfs() 预处理,记录每种状态。然后状态置换,(重点要用到全排列的hash记录状态)...
查看>>
构建之法课后作业第一次作业(15个题选一个)
查看>>
操作redis方法
查看>>
C语言函数
查看>>
Python3-异常处理
查看>>
Python-简单打印进度条
查看>>
【02】天气查询应用(第二课)
查看>>
监听微信返回按钮
查看>>
第二次实验报告
查看>>
HDU ACM 3790 最短路径问题
查看>>
python生成器
查看>>
linux 安装 ftp
查看>>
python 监控FTP目录下的文件个数
查看>>
MapInfo格式转arggis格式
查看>>
Network - SSL/TLS的基本概念
查看>>
python学习之老男孩python全栈第九期_day012知识点总结
查看>>
Shell if else
查看>>
iOS之 block,代替代理作为回调函数
查看>>