jar包
使用ioc
注解开发时除了几个基本的jar包还需要使用aop
的包(Spring4
时才需要aop包):
* beans包
* context包
* core包
* epression包
* aop包
配置文件
我们在使用xml配置文件开发时引入的是beans
约束,但是如果是使用注解开发需要引入context
约束。
如何查找context约束
在 spring-framework-4.3.9.RELEASE\docs\spring-framework-reference\html
中可以找到context 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>
对于其余的约束也是一样的,都是在这个文件中去查找。
组件扫描
虽然是使用注解开发但是在xml
配置文件中需要开启组件扫描。
<context:component-scan base-package="包路径" />
注意:开启该组件的作用是扫描类,也就是如果需要在类上面使用注解就必须要开启该扫描(开启了该扫描对于不是类上面的注解当然也是可以使用的)
在类上面添加注解
@Component(value=“名称”)注解
@Component("userDao") //value是可以省略的
public class UserDao{
public void save(){
System.out.print("保存数据");
}
}
类似功能的类注解
@Component注解是适用于所有的类的,这样不利于分层思想,所以Spring又提供了下面的三个注解,目前来说下面的三个注解和@Component的作用是一致的。
@Controller :web层
@Service :service层
@Repository :dao层
使用注解设置属性
使用注解来设置属性值时可以没有set方法,当没有set方法时就将注解添加在属性上面,如果是set方法就需要将注解添加在set方法上。
基本属性
@Component("userDao") //value是可以省略的
public class UserDao{
//@Value("张三"),如果没有下面的set方法就直接将注解写在属性上面
private String name;
@Value("张三")
public void setName(String name){
this.name = name;
}
public void save(){
System.out.print("保存数据");
}
}
- 基本属性注解使用的是
@Value
,后面直接跟上属性值即可。
对象属性
对于对象是使用@Autowired
public class UserService{
//注入dao,使用注解可以没有set方法
@Autowired
private UserDao userDao;
public void save(){
userDao.save();
}
}
-
@Autowired
注解是设置对象类型属性的值,但是按照类型完成属性的注入所谓的按照类型的意思就是名称不需要一样,比如这里的service类里面的
UserDao
对象的名称是userDao
,而UserDao
类里面的注解是@Repository(“userDao222”)
,这里userDao222
与userDao
是不同的,但是依然是可以将值注入进去,因为这是按照类型注入的,都是UserDao
类的类型。 -
也可以通过
@Autowired
注解和@qualifier
注解一起使用来完成按照名称属性注入。@Repository("userDao1") public Class UserDao{ public void save(){ syytem.out.print("执行保存方法"); } }
public class UserService{ //注入dao,使用注解可以没有set方法 @Autowired @Qualifier(value="userDao1") private UserDao userDao; public void save(){ userDao.save(); } }
在上面的例子中
@Qualifier
里面的value
必须和@Repository
里面的value
是一致的才可以完成注入,这就是按照名称注入。 -
按照名称完成注解还有一个替代的注解
@Resource
public class UserService{ //@Resource里面使用的是name不是value @Resource(name="userDao1") private UserDao userDao; public void save(){ userDao.save(); } }
bean的其他注解
生命周期的注解
@PostConstruct
初始化方法的注解,与使用xml
注解时里面的init-method
一致@PreDestory
销毁方法的注解
Bean的作用范围注解
@Scope
作用范围(加载类上面的,有以下值)singleton
单例模式(默认值)prototype
多例模式request
session
globalsession
xml与注解整合开发
正因为xml
与注解各有优势,所以有时候也会有公司并不是单纯的使用xml
或者注解来开发,而是结合两者一起,让他们管理不同的功能。
xml
配置文件主要是完成ioc
,也就是bean
的管理- 注解主要完成
di
,也就是依赖注入,因为使用注解完成di
时不需要set
方法
因为bean管理是交给xml配置文件的,所以不需要开启包扫描(之前已经说过包扫描主要是扫描类上面的注解),但是属性注入也是需要注解的,此时可以在xml配置文件中写上下面的代码:
<context: annotation-config />
上面的代码开启后是在没有开启包扫描的情形下,使用注入属性的注解。