Spring 学习 (二)IOC注解

IOC注解

配置环境:

将   

引入到项目中,然后在application.xml中引入注解的约束

下面是在有beans后又引入了context的约束
<?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的文件中打开html,找到 the context schema

然后就可以开始学习了。


在application.xml中配置文件 配置组件扫描

    <!-- 使用IoC的注解开发,配置组件扫描(哪些包下的类使用IoC的注解) -->
    <context:component-scan base-package="com.ysx.spring.demo1"></context:component-scan>
    base-package 代表需要组件扫描的包,需要用到注解的文件可以在这个包下也可以在这个包的子包下
    比如我们上面也可以写base-package="com.ysx.spring"表示需要扫描spring包下所有子包或者文件

创建接口和接口实现类

public interface UserDAO {
	public void save();
}

@Component("userDao")//相当于<bean id="userDao" class="com.ysx.spring.demo1.UserDAOImpl"/>
public class UserDAOImpl implements UserDAO {
	
	private String name;

	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("用户信息保存的方法执行了。。。" + name);
	}

}

测试类

public class SpringDemo1 {
	
	@Test
	public void demo1() {
		ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserDAO userDao = (UserDAO) applicationContext.getBean("userDao");
		userDao.save();
	}
}

使用@Component注解标识UserDAOImpl之后,就表示要把UserDAOImpl交给Spring容器管理,Spring容器中会存在一个名字为"userDao"的action.

注意:如果@Component不指定其value【@Component】,则默认的bean名字为这个类的类名首字母小写如果指定value【@Component(value="userDao")】或者【@Component("userDao")】,则使用value作为bean的名字

这个例子我们可以看到通过注解我们不需要再在application.xml中加入<bean>就可以操作,这里就会发现没有注解的缺点

传统的Spring做法是使用.xml文件来对bean进行注入或者是配置aop、事物,这么做有两个缺点:
1、如果所有的内容都配置在.xml文件中,那么.xml文件将会十分庞大;如果按需求分开.xml文件,那么.xml文件又会非常多。总之这将导致配置文件的可读性与可维护性变得很低。
2、在开发中在.java文件和.xml文件之间不断切换,是一件麻烦的事,同时这种思维上的不连贯也会降低开发的效率。
为了解决这两个问题,Spring引入了注解,通过"@XXX"的方式,让注解与Java Bean紧密结合,既大大减少了配置文件的体积,又增加了Java Bean的可读性与内聚性。

@Component
是所有受Spring 管理组件的通用形式,@Component注解可以放在类的头上,@Component不推荐使用。因为它有三个衍生注解(功能类似)

  • @Controller     :web层
  • @Service         :service层
  • @Repository    :dao层

用法和Component完全一样,唯一不一样的就是它们分别在不同场景使用。

 

属性注入的注解:(使用注解注入的方式,可以不用提供 set 方法.)

 

普通属性注入用:  @Value (注意:有该属性的setter方法时注解放在方法上面,没有则将注解放在属性名上面)

@Component("userDao")//相当于<bean id="userDao" class="com.ysx.spring.demo1.UserDAOImpl"/>
public class UserDAOImpl implements UserDAO {
	
	private String name;

    @Value("杨大侠在学注解")
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("用户信息保存的方法执行了。。。" + name);
	}

}

对象属性注入用:  @Autowired (但是它是按照默认按类型进行装配,也就是通过类来匹配,名字不重要 )

那为了解决这个问题我们通常在它下面加另一个注解    @Qualifier(强制使用名称注入)

public class UserDAOImpl implements UserDAO {
	
    @Autowired
    @Qualifier("user123") //强行按照这个名称的属性注入
	private User user;

    @Value("杨大侠在学注解")
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("用户信息保存的方法执行了。。。" + name);
	}

}

看到这里我想告诉你,这个也不常用 = = (不要骂我),我们通常用下面的注解来代替@Autowired 和 @Qualifier

@Resource (但它不是注解的jar包里的,需要导包)

public class UserDAOImpl implements UserDAO {
	
    //@Autowired
    //@Qualifier("user123") //强行按照这个名称的属性注入

    @Resource(name="user123")
	private User user;

    @Value("杨大侠在学注解")
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("用户信息保存的方法执行了。。。" + name);
	}

}

Bean 的其它的注解:

Bean 的生命周期的配置:

@PostConstruct     :相当于 init-method

@PreDestroy          :相当于 destroy-method

Bean作用范围的注解

@Scope

  •   singleton    :  默认单例
  •   prototype   :多例
  •   request
  •   session
  •   globalsession
@Component("userDao")//相当于<bean id="userDao" class="com.ysx.spring.demo1.UserDAOImpl"/>

@Scope("session")
public class UserDAOImpl implements UserDAO {
	
	private String name;

    @Value("杨大侠在学注解")
	public void setName(String name) {
		this.name = name;
	}

	@Override
	public void save() {
		// TODO Auto-generated method stub
		System.out.println("用户信息保存的方法执行了。。。" + name);
	}

}

比较XML和注解

XML:可以适用任何场景。(结构清晰,维护方便)

注解:有些地方用不了,这个类不是自己提供的。(开发方便)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值