Spring注入泛型类

本文介绍如何使用Spring框架通过泛型自动注入不同实现类的方法。通过具体的代码示例,展示了如何在BaseService中使用@Autowired自动注入BookDao或UserDao等泛型特定的Dao层对象。

Spring注入泛型类

大家好今天教大家使用Spring框架注入泛型类
在这里插入图片描述

问题描述:

在Dao层存在的BookDao与UserDao对数据库进行操作,那么就需要在BookService中使用到不同的Dao对象,Spring使如何区分相同的Dao的不同实现类的呢?

回答是Spring使用到了以泛型作为注入条件自动进行注入,代码描述如下:

bean:

package T.pojo;

public class User {
}

public class Book {
}

dao层:

package T.dao;

import T.pojo.User;
import org.springframework.stereotype.Repository;

@Repository
// 继承BaseDao并带有子类的泛型User
public class UserDao extends BaseDao<User>{
    @Override
    public void save() {
        System.out.println("UserDao Save...");
    }
}
package T.dao;

import org.springframework.stereotype.Repository;

@Repository
// 抽象方法定义接口,Spring在查找
public abstract class BaseDao<T> {
    public abstract void save();
}
package T.dao;

import T.pojo.Book;
import org.springframework.stereotype.Repository;

@Repository
// 继承BaseDao并带有子类的泛型Book
public class BookDao extends BaseDao<Book>{
    @Override
    public void save() {
        System.out.println("BookDao save ...");
    }
}
package T.dao;

import org.springframework.stereotype.Repository;

@Repository
public abstract class BaseDao<T> {
    public abstract void save();
}

service层:

package T.service;

import T.pojo.User;
import org.springframework.stereotype.Service;

@Service
// 继承自BaseService,同时自带了属于自己的泛型
public class UserService extends BaseService<User>{
}
package T.service;

import T.pojo.Book;
import org.springframework.stereotype.Service;

@Service
// 继承自BaseService,同时自带了属于自己的泛型
public class BookService extends BaseService<Book>{
}
package T.service;

import T.dao.BaseDao;
import org.springframework.beans.factory.annotation.Autowired;
// 没有注解!但是它是父类,子类有注解,并不影响Spring进行查找
public class BaseService<T>{
    @Autowired
    // 使用泛型自动注入对应的Dao类,泛型声明为User的,就注入UserDao作为子类
    // 泛型声明为Book的,就注入BookDao作为子类
    private BaseDao<T> baseDao;

    public void save(){
        System.out.println("自动注入Dao:"+baseDao);
        // 这里还有多态的使用,调用子类save的方法。
        baseDao.save();
    }
}

测试:

package T;

import T.service.BookService;
import T.service.UserService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class test {
    ApplicationContext ioc = new ClassPathXmlApplicationContext("bean6.xml");
    @Test
    public void test1(){
        UserService userService= ioc.getBean(UserService.class);
        BookService bookService = ioc.getBean(BookService.class);

        userService.save();
        bookService.save();
    }
}

需要注意的是:在BaseService中,生成了BaseDao对象,继承自BaseService对象调用save方法时,BaseService会根据子类的泛型使用@Autowired进行注入,「private BaseDao T baseDao」,就完成了注入,然后调用方法。

「private BaseDao T baseDao」这行代码使用多态进行实现。

总结一下就是,使用继承传递泛型参数,Spring根据不同的泛型参数使用@Autowire注入对象。

在这里插入图片描述

评论 5
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值