Spring(注解+依赖注入+无配置注解)适合回顾♥♥

Posted 牛牛最爱喝兽奶

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring(注解+依赖注入+无配置注解)适合回顾♥♥相关的知识,希望对你有一定的参考价值。

Spring注解



bean 注入与装配的的方式有很多种,可以通过 xml,get set 方式,构造函数或者注解等。简单易
用的方式就是使用 Spring 的注解了,Spring 提供了大量的注解方式。

IOC和DI

在介绍注解之前呢,我先来给大家谈谈IOC(控制反转和依赖注入)。作为Spring核心思想之一的IOC,唯一目的就是降低对象与对象之间的一个耦合度,例如我们平时写的代码,经常将几个对象之间进行嵌套使用,错综复杂管理起来极不方便,所以导致了代码维护困难。如下图:
其实耦合关系不仅会出现在对象与对象之间,也会出现在软件系统的各模块之间,以及软件系统和硬件系统之间。要想降低对象与对象之间的一个耦合度,科学家们提出了IOC控制反转的思想,如下图:
通过IOC容器来过度对象与对象之间的连接关系,若此时去掉IOC容器四个对象就独立出来了。且相互之间毫无联系。控制反转,传统的应用程序中,控制权在程序本身,程序的控制流程完全由开发者控制,这种模式的缺点是,一个组件如果要使用另一个组件,必须先知道如何正确地创建它。在IoC模式下,控制权发生了反转,即从应用程序转移到了IoC容器,所有组件不再由应用程序自己创建和配置,而是由IoC容器负责,这样,应用程序只需要直接使用已经创建好并且配置好的组件。为了能让组件在IoC容器中被“装配”出来,需要某种“注入”机制(DI)。由原来的主动创建,到现在的被动实现,控制权实现了反转,也就叫控制反转。由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。
DI: 实际上DI就是LOC的另一个名字,区别不是很大,控制反转要依赖于DI注入,实际上给出了实现IOC的方法:注入。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 所以,依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,指就是通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。
(注入的方式已在另一篇文章介绍DI注入方式

注解

注解
1.注解的使用
@Controller
@Controller(“Bean的名称”) 定义控制层Bean,如Action
@Service
@Service(“Bean的名称”) 定义业务层Bean
@Repository
@Repository(“Bean的名称”) 定义DAO层Bean
@Component 定义Bean, 不好归类时使用.
可以指定bean的id,默认时类名首字母小写。

@Autowired  (Srping提供的)

默认按类型匹配,自动装配(Srping提供的),可以写在成员属性上,或写在setter方法上
@Autowired(required=true)  
一定要找到匹配的Bean,否则抛异常。 默认值就是true
@Autowired
@Qualifier("bean的名字") 
按名称装配Bean,与@Autowired组合使用,解决按类型匹配找到多个Bean问题。

@Resource   JSR-250提供的
默认按名称装配,当找不到名称匹配的bean再按类型装配.
可以写在成员属性上,或写在setter方法上
可以通过@Resource(name="beanName") 指定被注入的bean的名称, 要是未指定name属性, 默认使用成员属性的变量名,一般不用写name属性.
@Resource(name="beanName")指定了name属性,按名称注入但没找到bean, 就不会再按类型装配了.
@Inject   是JSR-330提供的
按类型装配,功能比@Autowired少,没有使用的必要。

bean配置文件中必须加入以下配置,否则注解不起作用。

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

dao层

import org.springframework.stereotype.Repository;
@Repository
public class DaoTest {
    public void add(){
        System.out.println("Dao_test com on!");
    }
}

服务层

@org.springframework.stereotype.Service//将该类交给spring来管理
public class Service {
    @Qualifier("daoTest")//指定加载daoTest
    @Autowired//根据变量类型赋值
    private DaoTest daoTest;
    public void add(){
        daoTest.add();
        System.out.println("service_test hello");
    }
}

控制层

@Controller
public class Action {
    @Autowired
    private Service service;
    public void add(){
        service.add();
        System.out.println("Action come on!");
    }
}

测试:

    @Test
    public void test3(){
        ApplicationContext at = new ClassPathXmlApplicationContext("spring-action.xml");
        Action a = at.getBean("action",Action.class);//默认id是类名首字母小写
        System.out.println(a);
        Service s = at.getBean(Service.class);//("service",Service.class)
        System.out.println(s);
        DaoTest d = at.getBean(DaoTest.class);
        System.out.println(d);
        a.add();
    }

本质上就是将类交给IOC容器进行管理
2.无配置注解

    <!--扫描包+注解-->
    <context:component-scan base-package="com.xiaoliu"></context:component-scan>
    <!--出去控制层注解,-->
    <context:component-scan base-package="com.xiaoliu.pojo" use-default-filters="false"><!--只包含必须取消默认-->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

    <context:component-scan base-package="com.xiaoliu.pojo" ><!--不包含-->
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller" />
    </context:component-scan>

测试案例

1.引入外部文件以及数据库连接池的配置(druid.pool)

<!-- 导入外部文件-->
    <context:property-placeholder location="db.properties"></context:property-placeholder>
    <bean class="com.alibaba.druid.pool.DruidDataSource" id="dataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}"></property>
        <property name="url" value="${jdbc.url}"></property>
        <property name="password" value="${jdbc.password}"></property>
        <property name="username" value="${jdbc.name}"></property>
    </bean>

以上是关于Spring(注解+依赖注入+无配置注解)适合回顾♥♥的主要内容,如果未能解决你的问题,请参考以下文章

Spring使用注解配置依赖注入

Spring中@Autowired@Resource和@Inject注解的使用和区别

spring中依赖注入的原理

Spring源码解析-基于注解依赖注入

Spring框架bean的配置:基于注解的配置,Autowired 自动装配 Bean,泛型依赖注入

spring之注解概述