Какова цель @Component в реализациях фабрики OSGI?

Я пытаюсь реализовать servicefactory, используя аннотации apache felix scr.

@Component
@Service(serviceFactory = true)
@Properties(value = { @Property(name = "className", value = "interface1") })
public class Tinterfaceimpl1 implements Tinterface {

    @Override
    public void consumeService() {
        System.out.println("tinterfaceimpl1");
    }
}

Выше код работает нормально. Но какова цель @Component? Потому что я пытаюсь выставить его как сервис, а не как компонент, так и сервис. Если я удалю @Component состояние неудовлетворен. Действительно ли для фабрики обязательно использовать как компонент, так и сервис? pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>TinterfaceImpl</groupId>
    <artifactId>TinterfaceImpl</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <build>
        <sourceDirectory>src</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <extensions>true</extensions>
                <version>2.3.5</version>
                <!-- <configuration>
                    <instructions>
                        <Import-Package>com.java.serviceeg.tinterface.Tinterface</Import-Package>
                    </instructions>
                </configuration> -->
            </plugin>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-scr-plugin</artifactId>
                <version>1.14.0</version>
                <executions>
                    <execution>
                        <id>generate-scr-scrdescriptor</id>
                        <goals>
                            <goal>scr</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        </build>
        <dependencies>
            <!-- Felix SCR annotations -->
            <dependency>
                <groupId>org.apache.felix</groupId>
                <artifactId>org.apache.felix.scr.annotations</artifactId>
                <version>1.9.6</version>
            </dependency>
            <dependency>
                <groupId>org.apache.felix</groupId>
                <artifactId>org.apache.felix.scr</artifactId>
                <version>1.6.0</version>
            </dependency>
            <dependency>
                <groupId>Tinterface</groupId>
                <artifactId>Tinterface</artifactId>
                <version>0.0.1-SNAPSHOT</version>
                <type>bundle</type>
            </dependency>
        </dependencies>
        <packaging>bundle</packaging>

</project>

1 ответ

Да, это обязательно. Он объявляет ваш класс как компонент в соответствии со спецификацией декларативных сервисов. Без @Component аннотация, это просто какой-то класс, торчащий в вашем комплекте.

Компоненты также могут быть опубликованы как сервисы, как в этом примере. Но компоненты не обязательно должны быть сервисами - вместо этого они могут предоставлять какой-то внешний интерфейс, например, сокет сервера или графический интерфейс.

Другие вопросы по тегам