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:可以适用任何场景。(结构清晰,维护方便)
注解:有些地方用不了,这个类不是自己提供的。(开发方便)