基于Java Config配置注解方式构建的SpringIoC

    xiaoxiao2025-05-30  94

    实现思路

    1)应用程序不主动创建对象,但要描述创建它们的方式。 2)在应用程序代码中不直接进行服务的装配,但要配置文件中描述哪一个组件需要哪一项服务。容器负责将这 些装配在一起

    代码结构

    实现细节

    1)SpringConfig Bean的定义,在标注了@Configiration的Java类中,通过在类方法上标注@Bean定义一个Bean,方法必须提供Bean的实例化逻辑。Bean的名称默认为方法名。

    import com.mechanicalwood.dao.UserInfoDAO; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; @Configuration //配置spring的相关信息 @ComponentScan(basePackages = "com.mechanicalwood") public class SpringConfig { @Bean public UserInfoDAO getUserInfoDAO(){ return new UserInfoDAO(); } }

    2)UserInfo 构建的JavaBean

    public class UserInfo { private String username; private String password; private Integer age; public UserInfo(){ } 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; } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } }

    3)UserInfoService 模拟数据访问层,属性的获取可以通过与数据库的交互来完成。

    import java.util.ArrayList; import java.util.List; public class UserInfoDAO { public List<UserInfo> queryUesrInfo(){ List<UserInfo> userInfoList = new ArrayList<>(); for(int i = 0; i < 10; i++){ UserInfo userInfo = new UserInfo(); userInfo.setUsername("username_" + i); userInfo.setPassword("password_" + i); userInfo.setAge(i+1); userInfoList.add(userInfo); } return userInfoList; } }

    4)UserInfoService 业务逻辑层用于具体业务的实现。

    @Service 将ShapeService标注为一个Bean,通过@Autowired注入Shape的Bean。@Autowired默认是按类型 (byType)匹配的方式在容器中查找匹配的Bean,当有且仅有一个匹配的Bean时,Spring将其注入@Autowired标 注的变量中。

    import com.mechanicalwood.dao.UserInfoDAO; import com.mechanicalwood.vo.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class UserInfoService { @Autowired private UserInfoDAO userInfoDAO; public List<UserInfo> queryUserInfo(){ return userInfoDAO.queryUesrInfo(); } }

    5)SpringTest 使用AnnotationConfigApplicationContext可以实现基于Java的配置类加载Spring的应用上下文。

    import org.junit.After; import org.junit.Before; import org.junit.Test; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import java.util.List; public class SpringTest { private AnnotationConfigApplicationContext context = null; @Before public void initFunc(){ context = new AnnotationConfigApplicationContext(SpringConfig.class); } @Test public void testFunction(){ UserInfoService userInfoService = context.getBean(UserInfoService.class); List<UserInfo> userInfoList = userInfoService.queryUserInfo(); for (UserInfo userInfo:userInfoList) { System.out.println("username = " + userInfo.getUsername() + " , " + "password = " + userInfo.getPassword() + "," + " age = " + userInfo.getAge()); } } @After public void myDestroy(){ context.destroy(); } }

    运行结果

    IoC容器的特点

    无需主动new对象,而是描述对象应该如何被创建即可,IoC容器帮你创建,即被动实例化不需要主动装配对象之间的依赖关系,而是描述需要哪个服务(组件),IoC容器会帮你装配(即负责将它们 关联在一起),被动接受装配迪米特法则(最少知识原则):不知道依赖的具体实现,只知道需要提供某类服务的对象(面向抽象编 程),松散耦合,一个对象应当对其它对象有尽可能少的了解IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则
    最新回复(0)