Spring注入泛型类

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注入对象。

在这里插入图片描述

Spring框架可以通过依赖注入来管理对象之间的关系。泛型依赖注入Spring 4版本引入的一个新特性,它允许我们使用泛型类型作为依赖注入的目标类型。 在Spring中,我们可以使用`@Autowired`注解来实现依赖注入。在Spring 4之前的版本中,我们只能使用具体的类型来指定注入的目标类型。但是在Spring 4中,我们可以使用泛型类型来指定注入的目标类型。 泛型依赖注入的好处之一是可以减少重复的代码。例如,我们可以定义一个通用的泛型接口或抽象类,然后在具体的类中使用泛型类型来指定依赖注入的目标类型。这样,我们可以减少重复的配置代码,并提高代码的可维护性和灵活性。 另一个好处是增加了类型安全性。使用泛型类型来指定依赖注入的目标类型可以在编译时检查类型是否匹配,避免在运行时出现类型转换错误或异常。 下面是一个示例代码,演示如何在Spring 4中使用泛型依赖注入: ```java public interface GenericDao<T> { // ... } @Component public class UserDao implements GenericDao<User> { // ... } @Service public class UserService { @Autowired private GenericDao<User> userDao; // ... } ``` 在上面的示例中,我们定义了一个泛型接口`GenericDao`,并在具体的实现类`UserDao`中使用了具体的类型`User`来指定泛型类型。然后,我们在`UserService`中使用泛型类型`User`来注入`UserDao`。 通过使用泛型依赖注入,我们可以更方便地管理依赖关系,并且减少了重复的配置代码。这是Spring 4版本引入的一个有用的特性,可以在开发中提高效率和代码质量。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值