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,使用注解进行属性注入