Spring注解实现自动装配(一)

Spring注解实现自动装配(一)(eclipse)

配置文件的实现:
<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    <!--开启注解支持-->
	<context:annotation-config/>

</beans>
需要导入的包

commons-logging-1.2.jar
spring-beans-4.3.6.RELEASE.jar
spring-context-4.3.6.RELEASE.jar
spring-core-4.3.6.RELEASE.jar
spring-expression-4.3.6.RELEASE.jar
spring-aop-4.3.6.RELEASE.jar
注: 如果不导入“ spring-aop-4.3.6.RELEASE.jar ”包会导致报错。

Exception in thread "main" org.springframework.beans.factory.BeanDefinitionStoreException: Unexpected exception parsing XML document from class path resource [applicationContext.xml]; nested exception is java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:414)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:336)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:304)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:181)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:217)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:188)
	at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:252)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:127)
	at org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:93)
	at org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:129)
	at org.springframework.context.support.AbstractApplicationContext.obtainFreshBeanFactory(AbstractApplicationContext.java:613)
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:514)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:139)
	at org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:83)
	at spring.pojo.Test.main(Test.java:9)
Caused by: java.lang.NoClassDefFoundError: org/springframework/aop/TargetSource
	at org.springframework.context.annotation.AnnotationConfigUtils.registerAnnotationConfigProcessors(AnnotationConfigUtils.java:154)
	at org.springframework.context.annotation.AnnotationConfigBeanDefinitionParser.parse(AnnotationConfigBeanDefinitionParser.java:47)
	at org.springframework.beans.factory.xml.NamespaceHandlerSupport.parse(NamespaceHandlerSupport.java:74)
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1411)
	at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1401)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:172)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:142)
	at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:94)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:508)
	at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:392)
	... 14 more
Caused by: java.lang.ClassNotFoundException: org.springframework.aop.TargetSource
	at java.net.URLClassLoader.findClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
	at java.lang.ClassLoader.loadClass(Unknown Source)
	... 24 more
@Autowired注解
1)可以在属性中使用 @Autowired 注释来除去 setter 方法。当时使用 为自动连接属性传递的时候,Spring 会将这些传递过来的值或者引用自动分配给那些属性。

配置文件

	<bean id="cat" class="com.zhisheng.pojo.Cat" />
	<bean id="dog" class="com.zhisheng.pojo.Dog" />
	<bean id="people" class="com.zhisheng.pojo.People" />

实体类Cat

package com.zhisheng.pojo;

public class Cat {
	
	public void shout() {
		System.out.println("miaomiao");
	}
}

实体类Dog

package com.zhisheng.pojo;

public class Dog {

	public void shout() {
		System.out.println("Wangwang");
	}
}

实体类People

package com.zhisheng.pojo;

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

public class People {
	@Autowired
	private Dog dog;
	@Autowired
	private Cat cat;
	private String name;
	/*省略构造、getter、tostring方法*/

测试类

package com.test;

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

import com.zhisheng.pojo.People;

public class Test {

	@org.junit.Test
	public void test() {
		ApplicationContext ctxt = new ClassPathXmlApplicationContext("applicationContext.xml");
		People p = ctxt.getBean("people",People.class);
		p.getCat().shout();
		p.getDog().shout();
	}
}
2)在setter 方法中使用 @Autowired 注释来除去xml中的元素。当 Spring遇到一个在 setter 方法中使用的 @Autowired 注释,它会在方法中视图执行 byType 自动连接。
package com.zhisheng.pojo;

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

public class People {

	private Dog dog;
	private Cat cat;
	private String name;
	
	public People() {
		
	}
	public People(Dog dog,Cat cat,String name) {
		this.cat=cat;
		this.dog=dog;
		this.name=name;
	}
	public Dog getDog() {
		return dog;
	}
	@Autowired
	public void setDog(Dog dog) {
		this.dog = dog;
	}
	
	public Cat getCat() {
		return cat;
	}
	@Autowired
	public void setCat(Cat cat) {
		this.cat = cat;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
}
3)构造函数中@Autowired:在构造函数中使用 @Autowired。一个构造函数 @Autowired 说明当创建 bean 时,即使在 XML 文件中没有使用 元素配置 bean ,构造函数也会被自动连接。
4)@Autowired(required=false)

默认情况下,@Autowired 注释意味着依赖是必须的,它类似于 @Required 注释,然而,你可以使用 @Autowired 的(required=false) 选项关闭默认行为。

例如:在下面的People类中即使不设置cat和dog的值也会运行成功。(同理也可在属性上注释)

People实体类

package com.zhisheng.pojo;
import org.springframework.beans.factory.annotation.Autowired;
public class People {
	
	private Dog dog;
	private Cat cat;
	private String name;

	public People() {
		
	}

	public People(Dog dog,Cat cat,String name) {
		
		this.cat=cat;
		this.dog=dog;
		this.name=name;
	}
	public Dog getDog() {
		return dog;
	}
	@Autowired(required=false)
	public void setDog(Dog dog) {
		this.dog = dog;
	}
	
	public Cat getCat() {
		return cat;
	}
	@Autowired(required=false)
	public void setCat(Cat cat) {
		this.cat = cat;
	}
	
	public String getName() {
		return name;
	}
	
	public void setName(String name) {
		this.name = name;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "People [dog=" + dog + ", cat=" + cat + ", name=" + name + ", getDog()=" + getDog() + ", getCat()="
				+ getCat() + ", getName()=" + getName() + ", getClass()=" + getClass() + ", hashCode()=" + hashCode()
				+ ", toString()=" + super.toString() + "]";
	}
	
	
}

配置文件:

<?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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    
	<context:annotation-config/>
	
	<bean id="people" class="com.zhisheng.pojo.People">
		<property name="name" value="123"></property>
	</bean>
</beans>

测试类

package com.test;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.zhisheng.pojo.People;

public class Test {

	@org.junit.Test
	public void test() {
		ApplicationContext ctxt = new ClassPathXmlApplicationContext("applicationContext.xml");
		People p = ctxt.getBean("people",People.class);
		System.out.println(p.getName());
		System.out.println(p.toString());
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值