深入Spring源码专题(8)

这是我参与2022首次更文挑战的第14天,活动详情查看2022首次更文挑战

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmls="http://www.springframework.org/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
	http://www.springframework.org/schema/context/spring-context.xsd">
    <context:component-scan base-package="com.ozx.annotation" context:exclude-filter type="assignable" expression="com.example.NotAService"></context:component-scan>
</beans>

复制代码

上述所示的标记让Spring扫描指定的包,同时忽略那些在表达式中指定了类型的类,除了排除过滤器,还可以使用包含过滤器。对于类型,可使用注解、正则表达式、赋值、AspectJ或自定义类(实现了org.springframework.core.type.filter.TypeFilter的过滤器类)作为过滤条件,表达式的格式取决于所指定的类型。

声明Spring组件

在开发某种服务类并基于Spring的应用程序中使用它时,需要让Spring知道这些bean有资格注入其他bean并让Spring代为管理。

public interface MessageRenderer{
    void render();
    void setMessageProvider(MessageProvider messageProvider);
    MessageProvider getMessageProvider();
}

public class StandarOutMessageRenderer implements MessageRenderer{
    private MessageProvider messageProvider;
    @Override
    public void render(){
        if(messageProvider == null){
            throw new RuntimeException(StandarOutMessageRenderer.class.getName);
        }
        System.out.println(messageProvider.getMessage());
    }
    @Override
    public void setMessageProvider(MessageProvider messageProvider){
        this.messageProvider=messageProvider;
    }
    @Override
    public MessageProvider getMessageProvider(){
        return this.messageProvider;
    }
}
复制代码

想要在XML文件中声明bean定义,可以使用<bean ... />标记,最终的app-context-xml.xml文件如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmls="http://www.springframework.org/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:c="http://www.springframework.org/schema/c"
	xsi:schemaLocation="http://www.springframework.org/schema/beans
	http://www.springframework.org/schema/beans/spring-beans.xsd
	http://www.springframework.org/schema/context
                        http://www.springframework.org/schema/context/spring-context.xsd">
	<bean id="renderer" class="com.ozx.StandardOutMessageRenderer" p:messageProvider-ref="provider"/>
</beans>

复制代码

标记一个具有StandardOutMessageRenderer实现且ID为render的bean。

使用注解创建Bean定义,必须使用适当的构造型注解来注解Bean类,并且必须使用@Autowired注解方法或构造函数,通知SpringIOC容器。查找该类型的bean并将其用作调佣该方法时的参数。

猜你喜欢

转载自juejin.im/post/7060121340618997796