Ioc 配置的三种方式之 注解方式

世上唯一不能复制的是时间,唯一不能重演的是人生,唯一不劳而获的是年龄。该怎么走,过什么样的生活,全凭自己的选择和努力。人生很贵,请别浪费!与智者为伍,与良善者同行。Ioc 配置的三种方式之 注解方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

一、注解方式创建对象IOC

从 Spring 2.5 开始就可以使用注解来配置依赖注入。而不是采用 XML 来描述一个 bean 连线,可以使用相关类,方法或字段声明的注解,将 bean 配置移动到组件类本身。实现起来就是通过在类上加注解的方式,来声明一个类交给Spring管理,Spring会自动扫描带有@Component,@Controller,@Service,@Repository这四个注解的类,然后帮我们创建并管理,前提是需要先配置Spring的注解扫描器。

@Component 放在类上,用于标记,告诉spring当前类需要由容器实例化bean并放入容器中该注解有三个子注解

  • @Controller 用于实例化controller层bean
  • @Service 用于实例化service层bean
  • @Repository 用于实例化持久层bean

当不确定是哪一层,就用Component这几个注解互相混用其实也可以,但是不推荐

1.1.在applicationContext.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
">
    <!--添加注解扫描,指定扫描的包,将包中的所有注解的类实例化,产生对象
    需要注意,注解扫描后产生的bean的id默认是 类名首字母小写,也可以通过注解指定bean的名,例如 @Component("user1")
    base-package:指定扫描的包,如果有多个包,可以写上一层的包名,或者 com.augus01,com.augus02

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

1.2.在类上添加注解

spring容器会给我们创建bean实例并存储于容器中

package com.augus;

import org.springframework.stereotype.Component;

//在类上添加注解,让spring容器给我们创建bean实例并存储于容器中,可以通过value指定bean的id,不指定则默认是类名小写
@Component
//@Component(value = "user")
public class User {
    private Integer userid;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "userid=" + userid +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public User() {
        System.out.println("第一步:user构造");
    }

    public void initUser(){
        System.out.println("第三步:初始化user");
    }

    public void destoryUser(){
        System.out.println("第五步:User销毁");
    }

    public User(Integer userid, String username, String password) {
        this.userid = userid;
        this.username = username;
        this.password = password;
    }

    public Integer getUserid() {
        return userid;
    }

    public void setUserid(Integer userid) {
        System.out.println("第二步:user对象属性赋值");
        this.userid = userid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

1.3.组件扫描配置注解识别:补充一般不需要

这里可以设置只扫描某一个或者多个注解,也可以设置不扫描某一个或多个注解

<!--
    use-default-filters 默认值为true 代表使用默认的扫描过滤器
    默认的扫描过滤器会识别并包含 @Component @Controller @Service @Repository 四个注解
    不使用默认的filter,使用我们自己的filter
    -->
    <!--控制只扫描Controller注解-->
    <context:component-scan base-package="com.augus" use-default-filters="false">
        <!--
        nclude-filter 扫描那个注解
        -->
        <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>
    <!--控制不扫描Controller注解-->
    <context:component-scan base-package="com.augus" use-default-filters="true">
        <!--
        不扫描那个注解:exclude-filter 
        -->
        <context:exclude-filter  type="annotation" expression="org.springframework.stereotype.Controller"/>
    </context:component-scan>

1.4.测试代码

import com.augus.User;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test7 {
    @Test
    public void testGetBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext7.xml");
        // 获取对象 , 并且输出其属性的值
        User user = context.getBean("user", User.class);
        System.out.println(user);
    }

}

二、注解方式实现依赖注入DI

注解的方式实现依赖注入主要使用一下几个注解完成:

  • @Autowired 根据属性数据类型自动装配
  • @Qualifier 根据属性名称注入依赖
  • @Resources 可以根据类型,也可以根据名称注入
  • @Value 注入普通数据类型(8+String)

1.创建项目,项目结构如下

Ioc 配置的三种方式之 注解方式

2.创建接口和实体类

package com.augus.dao;

public interface UserDao {
    void add();
}
package com.augus.dao.impl;

import com.augus.dao.UserDao;
import org.springframework.stereotype.Repository;

//加上@Repository注解 自动产生UserDaoImplA bean对象
@Repository
public class UserDaoImplA implements UserDao {
    @Override
    public void add() {
        System.out.println("这是UserDaoImplA");
    }
}
package com.augus.dao.impl;

import com.augus.dao.UserDao;
import org.springframework.stereotype.Repository;

//加上@Repository注解 自动产生UserDaoImplB bean对象
@Repository
public class UserDaoImplB implements UserDao {
    @Override
    public void add() {
        System.out.println("这是UserDaoImplB");
    }
}
package com.augus.service;

public interface UserService {
    void add();
}
package com.augus.service.impl;

import com.augus.dao.UserDao;
import com.augus.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

//加上@Service注解 自动产生UserServiceImpl bean对象
@Service
public class UserServiceImpl implements UserService {
    /*
     * 根据类型到容器中去寻找对应的对象,找到后给当前属性赋值
     * 不需要依赖 set方法
     * 属性类型可以是接口,会自动匹配对应的实现类对象
     * @Autowired配合 @Qualifier,可以通过名称指定注入的对象
    **/
    @Autowired
    @Qualifier("userDaoImplB") //这里面userDao赋值的的时候,发现有两个实现类的对象,这时候就要区分这一次给谁赋值,不然会报错
    private UserDao userDao;
    //给普通数据类型直接赋值,这个不要用,以后那些值我们不确定
//    @Value("张无忌")
//    private String sname;
//    @Value("男")
//    private String sgender;
//    @Value("34")
//    private Integer sage;

    /*利用applicationContext.xml中读取出来的配置文件info.properties中的
    值注入给下面的属性
    *@Value 可以个普通属性赋值
    *@Value 可以使用${}这种表达式获取系统的变量值
    *       或者是获取.properties属性配置文件中的值
    * */
    @Value("${name}")
    private String sname;
    @Value("${gender}")
    private String sgender;
    @Value("${age}")
    private Integer sage;

    @Override
    public void add() {
        System.out.println("这是UserServiceImpl");
        System.out.println(sname);
        System.out.println(sgender);
        System.out.println(sage);
        userDao.add();
    }
}

3.创建配置文件

<?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:component-scan base-package="com.augus"></context:component-scan>

    <!--从配置文件info.properties中读取内容
    读取出来变量,可以注入给属性
    -->
    <context:property-placeholder location="classpath:info.properties"></context:property-placeholder>

</beans>

4.创建.properties文件,从中读取内容给赋值给属性

创建info.properties文件,内容如下:

name=李岩
gender=男
age=34

注意,这里面有中文,在idea中控制台输出会有乱码,所以需要设置一下

Ioc 配置的三种方式之 注解方式

5.测试

import com.augus.service.impl.UserServiceImpl;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test1 {
    @Test
    public void testGetBean(){
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

        UserServiceImpl userServiceImpl = context.getBean("userServiceImpl", UserServiceImpl.class);
        //调用对象的方法
        userServiceImpl.add();
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/253688.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!