какова цель @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, оно будет неудовлетворенным. Действительно ли заводу обязательно использовать и компонент, и услугу? пом.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>

person Shriram    schedule 09.12.2015    source источник


Ответы (1)


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

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

person Neil Bartlett    schedule 09.12.2015
comment
Я пытаюсь открыть службу, используя ds, для которой требуется аннотация компонента, в противном случае она не работает, и служба находится в неудовлетворительном состоянии. Не могли бы вы, почему требуется аннотация компонента, когда я использую просто услугу? Также не могли бы вы предоставить мне указатель для приведенного выше объяснения. - person Shriram; 31.12.2015
comment
Мой ответ объяснил, почему требуется @Component. То, что вы пишете, является одновременно сервисом и компонентом. - person Neil Bartlett; 31.12.2015
comment
Мой вопрос не был связан с вышеизложенным. Это просто сервис, который я реализую (с ds). Там он ожидает аннотацию компонента. Без аннотации сервис становится неудовлетворенным. - person Shriram; 01.01.2016
comment
Это потому, что требуется аннотация @Component. Я не знаю других способов сказать то же самое. - person Neil Bartlett; 02.01.2016
comment
Привет, могу я узнать, для чего используется атрибут factory в аннотации @component. - person vijaya kumar; 21.10.2016