学习JAVA途中问题解答

①为什么有的Controller里面可以直接调别的目录下的Utiles,而有些则需要自动注入?

不依赖于 Spring 容器的工具类: 有些工具类可能并不依赖于 Spring 容器中的其他 Bean,它们只是提供一些静态方法纯粹的功能函数。这样的工具类在调用时不需要被自动注入,可以直接通过类名调用其静态方法。这些工具类通常不需要交给 Spring 容器管理。

依赖于 Spring 容器的工具类: 有些工具类可能需要依赖于 Spring 容器中的其他 Bean,例如它们可能需要调用其他业务服务或组件。这样的工具类需要被 Spring 托管,因此可能会使用 @Component 或其他 Spring 注解进行标记,并在其他类中通过 @Autowired 进行注入。

②Set<>括号里面放的是接口代表什么?

在 Java 中,Set 是一种集合类型,表示不包含重复元素的无序集合。当在 Set 中放置一个接口类型时,这意味着你可以向 Set 中添加实现该接口的不同对象,并且 Set 会确保不会包含重复的对象。

public interface MyInterface {
    // 接口方法
}

public class MyClass implements MyInterface {
    // 实现接口的类
}

public class AnotherClass implements MyInterface {
    // 实现接口的另一个类
}

// 使用 Set 存放 MyInterface 类型的对象
Set<MyInterface> myInterfaceSet = new HashSet<>();
myInterfaceSet.add(new MyClass());
myInterfaceSet.add(new AnotherClass());
myInterfaceSet.add(new MyClass()); // 不会添加重复的 MyClass 对象

在这个例子中,myInterfaceSet 是一个 Set,它存放了两个不同的实现了 MyInterface 接口的对象:MyClassAnotherClass。由于 Set 不允许重复元素,重复添加相同类型的对象并不会导致集合中存在重复元素。

③接口之间是不是既可以继承也可以通过implement实现

接口与接口之间可以通过继承关系,但只有类与接口之间可以用implement

④类通过implement实现接口后可以只重写其中的个别方法吗

可以

⑤是不是在一个类上加了@Component,另一个类想要调这个类中的方法,可以自动注入?

是的,如果一个类上加了 @Component 注解,表示它是一个 Spring 组件(Bean),其他类可以通过自动注入的方式来使用这个组件中的方法。为了实现自动注入,需要在需要使用该组件的类上使用 @Autowired 注解。

import org.springframework.stereotype.Component;

// 声明为一个 Spring 组件
@Component
public class MyComponent {
    public void doSomething() {
        System.out.println("Doing something...");
    }
}
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class MyService {

    // 自动注入 MyComponent
    @Autowired
    private MyComponent myComponent;

    public void performAction() {
        // 调用 MyComponent 中的方法
        myComponent.doSomething();
    }
}

在这个例子中,MyService 类通过 @Autowired 注解自动注入了 MyComponent 类,并可以调用 MyComponent 中的 doSomething 方法。需要注意的是,@Service 注解用于声明 MyService 类为一个 Spring 服务组件,而 @Autowired 用于将 MyComponent 注入到 MyService 中。

⑥一个方法的返回值是接口而不是其实现类代表着什么?

当一个方法的返回值是接口而不是其实现类时,这通常表示一种良好的编程实践,即面向接口编程。这种做法有以下几个主要的好处:

  1. 抽象性和灵活性: 返回接口使得方法的实现更加抽象和灵活。调用者只需要知道返回的是某个接口,而不需要关心具体的实现类。这样,实现类可以根据需要灵活地进行切换,而不会对调用方造成影响。

  2. 解耦合: 面向接口编程有助于解耦合,降低类之间的依赖性。调用者不依赖于具体的实现类,而只依赖于接口,从而降低了代码的耦合度,提高了系统的可维护性和可扩展性。

  3. 依赖注入和测试: 返回接口便于进行依赖注入,因为依赖注入框架可以轻松地将实现类注入到需要的地方。此外,在进行单元测试时,可以使用接口的模拟实现来进行测试,而不需要依赖于真实的实现类。

    public class ServiceFactory {
        public static MyService createService() {
            // 创建并返回 MyServiceImpl 类的实例
            return new MyServiceImpl();
        }
    }
    

    这段代码最终返回的是一个接口的实现类的实例。具体来说,createService 方法返回的是 MyServiceImpl 类的实例,而 MyServiceImpl 类是实现了 MyService 接口的。调用 ServiceFactory.createService() 会得到一个 MyServiceImpl 类的实例,但由于 MyServiceImpl 类实现了 MyService 接口,因此返回的实例可以被当作 MyService 接口类型来使用。这是通过面向接口编程的一种常见实践,通过接口类型来引用具体的实现类,以提高代码的灵活性和可维护性。

 

  • 25
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值