Spring的IOC注解

Spring的IOC注解开发入门

新建项目,并导入jar包

在Spring4版本中,除了要导入基本的4个开发包和两个日志包外,还要导入aop

 引入spring的配置文件

在src下创建applicationContext.xml

配置xml的约束     约束配置模板去

spring-framework-4.2.4.RELEASE\docs\spring-framework-reference\html\xsd-configuration.html

 找  ontext-schema

<?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.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd"> 
        <!-- bean definitions here -->
</beans>

要使用Spring的IOC注解,先要配置context:component-scan标签,设置里面的base-package属性,该属性表示哪些包中的类需要用到Spring的IOC注解

<context:component-scan base-package="com.bwf.train1"/>

使用Spring的IOC注解

我们需要创建什么类,就在这个类上添加注解

/**
 * UserDAO的实现类
 * @author ysh
 *
 */
@Component(value="userDao")
/*也可以写成@Component("userDao"),相当于在配置文件中,配置了
<bean id="userDao" class="org.springframework.stereotype.Component.UserDAOImp">*/
public class UserDaoImp implements UserDao {

	@Override
	public void save() {
		System.out.println("保存数据的方法运行了。。。");
	}
}

测试

/**
	 * 注解方式
	 */
	public void train2() {
		ApplicationContext applicationContext =  new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDao dao = (UserDao) applicationContext.getBean("userDao");
		dao.save();
	}

注解方式设置属性的值

 使用注解方式可以不写set方法  

如果写了set方法,则把注解写在set方法上,否则写在属性上

@Component(value="userDao")
/*也可以写成@Component("userDao"),相当于在配置文件中,配置了
<bean id="userDao" class="org.springframework.stereotype.Component.UserDAOImp">*/
public class UserDaoImp implements UserDao {
	
  @value("aaa")
	private String name;
	
	/*public void setName(String name) {
		this.name = name;
	}*/

	@Override
	public void save() {
		System.out.println("保存数据的方法运行了。。。"+name);
	}
}

传统的方式设置属性值,不能依赖接口,且 必须手动调用set方法

Spring的IOC注解详解

@Component:组件

修饰一个类,将这个类交给Spring管理

由于Component注解可以用在任何类上,在实际开发中分层不明显,从而有了三个衍生注解

这个注解有三个衍生注解(功能类似),也是修饰类的:

           @Controller(web层)

           @Service(service层)

           @Repository(dao层)

属性注入的注解

普通属性:@Value(".....")

对象注解:@Autowired      :设置对象属性的值,但是这个注解是按照类型完成属性注入的(即,不是按照UserDao上的注解中value值,而是直接通过UserService中的dao属性类型[ UserDao类型 ])

@Component("userService")
public class UserServiceImp implements UserService {

	//注入dao
	@Autowired
	private UserDao dao;
	
	@Override
	public void save() {
		System.out.println("经过了service层。。。");
		dao.save();
	}

}

我们前面通过xml配置注入属性(DI)时,使用的却是对象类型名,如下为car2

<!-- set方法的方式 -->
	<bean id="car2" class="com.itheima.spring.demo4.Car2">
		<property name="name" value="奔驰"/>
		<property name="price" value="1000000"/>
	</bean>
	
	<!-- set方法注入对象类型的属性 -->
	<bean id="employee" class="com.itheima.spring.demo4.Employee">
		value:设置普通类型的值,ref:设置其他的类的id或name
		<property name="name" value="涛哥"/>
		<property name="car2" ref="car2"/>
	</bean>

我们要如何实现通过注解来按照对象类型名完成属性注入呢?这需要我们将 @Autowired 和 @Qualifier 一起使用

@Component("userService")
public class UserServiceImp implements UserService {

	//注入dao
	/*@Autowired
	@Qualifier(value="userDao")*/
	@Resource(name="userDao")
	private UserDao dao;
	
	@Override
	public void save() {
		System.out.println("经过了service层。。。");
		dao.save();
	}

}

还可以使用另一个替代@Autowired 和 @Qualifier 一起使用)的注解:@Resource

@Resource   按照名称完成对象属性注入    这个注解不是Spring内部的  其全路径为 javax.annotation.Resource

bean的其他注解

生命周期相关注解

@PostConstruct    初始化bean

@PreDestroy         销毁bean

bean的作用范围注解

@Scope     作用范围     在Struts2与spring注解整合时必须要用,因为Struts2默认是多例的action,spring默认是单例的bean

           singleton         单例

           prototype        多例

           request

           session

           globalsession

IOC的xml配置和注解配置的比较

xml配置与注解的比较

适用场景

      xml     适用任何场景    结构清晰,维护方便

      注解    只能在源代码中使用    易于开发

xml与注解整合开发(各取所长)

      使用xml管理bean,使用注解进行属性注入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值