注解(Annotations)是什么?你用过哪些注解?解释依赖注入(DI)。

发布时间:2024年01月18日

在编程语言中,注解(Annotation)是一种元数据机制,允许程序员向源代码中添加信息,这些信息可以被编译器、IDE或其他工具读取和处理,但不会影响程序的运行时行为。注解主要用于代码的自文档化、编译时检查、运行时处理(如依赖注入、持久化等)以及生成其他代码或XML配置文件等。

以下是一些常见的Java注解示例:

  1. @Override:表明该方法是重写父类中的某个方法,编译器会对此进行检查。

    
    public class ChildClass extends ParentClass {
    
        @Override
    
        public void someMethod() { ... }
    
    }
    
    
  2. @Deprecated:表示某个方法或者类已经不再推荐使用,并且可能在未来版本中被移除。

    
    @Deprecated
    
    public void oldMethod() { ... }
    
    
  3. @Autowired:在Spring框架中用于自动装配bean依赖关系。

    
    @Autowired
    
    private SomeService someService;
    
    
  4. @NotNull@NonNull(来自第三方库):表明某个参数或属性不应为null,这有助于编译时和运行时的空指针异常检测。

    
    public void someMethod(@NotNull String nonNullParam) { ... }
    
    
  5. JUnit测试相关的注解,例如:

    • @Test:标记一个方法为单元测试方法

    • @Before@After:分别在每个测试方法执行前和后执行的方法

    
    @Test
    
    public void testSomeFunctionality() { ... }
    
    
    
    @Before
    
    public void setUp() { ... }
    
    
    
    @After
    
    public void tearDown() { ... }
    
    

根据不同编程语言和框架,可用的注解类型和功能会有所不同。以上列举的是基于Java的一些常见注解示例。

依赖注入(Dependency Injection,简称 DI)是一种软件设计模式,用于减少软件组件之间的耦合度并提高它们的可测试性和可维护性。在传统的编程中,一个对象常常自行创建或查找它所依赖的对象,这导致各个组件之间紧密绑定,不利于复用和解耦。

依赖注入的核心思想是:组件不应该自行创建或查找其依赖的对象,而是应该由外部的一个“智慧”容器(例如 Spring 框架中的 IoC 容器)来负责创建和管理这些依赖对象,并将其传递给需要它们的组件。

具体实施时,依赖注入可以通过三种主要方式实现:

  1. 构造函数注入:通过构造函数向组件传递依赖对象。

public class MyClass {

    private MyDependency dependency;



    public MyClass(MyDependency dependency) {

        this.dependency = dependency;

    }

}

  1. setter 注入:通过setter方法注入依赖对象。

public class MyClass {

    private MyDependency dependency;



    public void setDependency(MyDependency dependency) {

        this.dependency = dependency;

    }

}



// 使用Spring配置文件示例:





  1. 接口注入:依赖对象作为接口的一部分被提供给组件。

依赖注入的优势在于它可以使组件独立于其依赖的具体实现,这样就可以轻松地更换或替换依赖,比如在单元测试中使用模拟对象代替实际对象,或者在不同环境中使用不同的实现。此外,这种设计也使得系统的架构更加清晰和模块化。

是的,Java从JDK 8开始支持默认方法(Default Methods)。默认方法是在接口中定义的具有实现的方法,并使用 default 关键字修饰。这样做的主要目的是允许接口在不破坏现有实现类的二进制兼容性的前提下进行扩展。

例如:


public interface MyInterface {

    default void someMethod() {

        System.out.println("This is a default method in MyInterface.");

    }

}

然后,任何实现了这个接口的类可以选择重写这个默认方法,或者直接使用接口提供的默认实现:


public class MyClass implements MyInterface {

    // 不重写someMethod时,会使用MyInterface的默认实现

    // 如果需要自定义行为,可以这样做:

    @Override

    public void someMethod() {

        System.out.println("This is a custom implementation in MyClass.");

    }

}

文章来源:https://blog.csdn.net/WangYaolove1314/article/details/135629821
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。