(16)spirng注解

配置注解生效

<context:annotation-config/>

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
        <context:annotation-config/>
        
        <bean id="hi" class="shuai.spring.study.Hi"/>
        
        <!-- setter注入 -->
        <bean id="hello" class="shuai.spring.study.HelloImpl6">
        	<property name="hi" ref="hi"/>
        </bean>
        
        <!-- 构造器注入 -->
        <!-- <bean id="hello1" class="shuai.spring.study.HelloImpl6">
        	<constructor-arg index="0" ref="hi"/>
        </bean> -->


</beans>

测试方法

package shuai.spring.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import shuai.spring.study.HelloApi;

public class HelloTest {
    @Test
    public void testHelloWorld() {

        @SuppressWarnings("resource")
        ApplicationContext context = new ClassPathXmlApplicationContext("HelloWorld.xml");

        HelloApi helloApi = context.getBean("hello", HelloApi.class);
        helloApi.sayHello();
    }
}


spring自带注解

@Required,应该只是一种检查

正常依赖注入可以根据构造方法注入或者setter注入

但是如果在setter方法加入@Required那就只能setter注入了,这时如果构造器注入打开,加载xml文件的时候就会报错。

package shuai.spring.study;

import org.springframework.beans.factory.annotation.Required;

public class HelloImpl6 implements HelloApi {
    private Hi hi;

    public HelloImpl6() {
    }

    public HelloImpl6(Hi hi) {
        this.hi = hi;
    }

    public Hi getHi() {
        return hi;
    }

    @Required
    public void setHi(Hi hi) {
        this.hi = hi;
    }

    @Override
    public void sayHello() {
        hi.saHi();
    }

}

@Autowired,自动装配,可以在属性,构造方法,setter方法上面加注解,普通方法也可以,只要有参数就行,方法体能为属性赋值就就行。xml只要写好bean就可以了,不用给属性注入值。

个人理解:@Autowired相当与把方法参数注入值,并且执行有注解的方法。

如果没有可用资源会报错,@Autowired(required = false)

如果有多个资源不知道选哪个,可以在参数前加@Qualifier("名称"),默认是根据类型注入,加了@Qualifier则变为根据名称注入

package shuai.spring.study;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;

public class HelloImpl6 implements HelloApi {

    private Hi hi;

    public HelloImpl6() {
    }

    public HelloImpl6(Hi hi) {
        this.hi = hi;
    }

    public Hi getHi() {
        return hi;
    }

    public void setHi(Hi hi) {
        this.hi = hi;
    }

    @Autowired(required = false)
    public void test(@Qualifier("hi") Hi hi) {
        System.out.println(hi);
        this.hi = hi;
    }

    @Override
    public void sayHello() {
        hi.saHi();
    }

}


<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" 
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop.xsd 
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd">
        
        <context:annotation-config/>
        
        <bean id="hi" class="shuai.spring.study.Hi"/>
        
        <bean id="hi1" class="shuai.spring.study.Hi"/>
        
        <!-- setter注入 -->
        <bean id="hello" class="shuai.spring.study.HelloImpl6">
        	<!-- <property name="hi" ref="hi"/> -->
        </bean>
        
        <!-- 构造器注入 -->
        <!-- <bean id="hello1" class="shuai.spring.study.HelloImpl6">
        	<constructor-arg index="0" ref="hi"/>
        </bean> -->


</beans>

还是上面的测试
输出结果:

shuai.spring.study.Hi@4b9e255
hi

也可以这样

<bean id="hi1" class="shuai.spring.study.Hi">
        <qualifier value="hi2"/>
</bean>

这样hi1将失效,

如果这样

<bean id="hi1" class="shuai.spring.study.Hi">
        <qualifier value="hi2"/>
        <qualifier value="hi3"/>
</bean>

hi1、hi2都失效,hi3有效

JSR-250注解

@Resource:自动装配,默认根据类型装配,如果指定name属性将根据名字装配,和@Autowired不同的是可以指定name来根据名字注入。


其它的看开涛老师的:http://jinnianshilongnian.iteye.com/blog/1457224


猜你喜欢

转载自blog.csdn.net/shuair/article/details/78798052
今日推荐