注解开发
在spring中,虽然可以使用xml的方式来进行bean的注入,bean的装配,bean属性值的注入。但是实际开发用注解进行开发是真的香,而使用xml进行bean的管理和装配的方式将会逐渐摒弃。
1 准备工作
在完成通过注解的方式来对bean进行注入之后,也可以用注解的方式来实现属性的自动注入。
前置环境:
-
导入context头文件
xmlns:context="http://www.springframework.org/schema/context" http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
-
开启注解支持
<context:annotation-config/>
-
开启包扫描,为了扫描头部的注解不需要也会扫描得到
<!--指定注解扫描包--> <context:component-scan base-package="com.kuang.pojo"/>
2 bean注入和属性值赋值
实体类:
@Component
public class User {
private String name;
@Value("王五")
public void setName(String name) {
this.name = name;
}
public String getName(){
return name;
}
}
可以在属性值上直接注入,但是有set方法时建议在set方法上注入
-
通过@Value("")的方式直接注入属性值,功能和bean中的相同
-
@Component注解和bean.xml文件中的bean标签作用一样,意思是将这个类交由spring容器管理
通过这种方式将实力类注入IOC容器之后不再需要在bean.xml中对实体类进行注入。
3 Component衍生注解
我们这些注解,就是替代了在配置文件当中配置步骤而已!更加的方便快捷!
@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
-
**@Controller:**web层
-
**@Service:**service层
-
**@Repository:**dao层
写上这些注解,就相当于将这个类交给Spring管理装配了!
4 bean的自动装配
在之前的博客有写到在一个bean中使用另一个bean。
@Resource(name = "cat1")
private Cat cat;
@Autowired
@Qualifier(value = "cat1")
private Cat cat;
- 而通过这么一中方式,实现了bean的装配。结合之前的内容,我们将可以完全摒弃xml配置文件的方式来对bean进行管理和注入。
- 注解方式,快捷而优雅
这样配合使用就完成了所有在bean.xml中的类和属性注入的所有功能。
5 作用域 @scope
singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收
@Controller("user")
@Scope("prototype")
public class User {
@Value("张三")
public String name;
}
6 小结
使用全注解的方式是主流的一种只用方式,在后续的springboo中更是常见使用。但是了解xml的方式有助于我们使用和理解框架的逐步演进。
- xml方式
<bean id="people" class="com.lyj.bean.People" autowire="byName">
<property name="name" value="张三"/>
<property name="dog" ref="dog"/>
</bean>
<bean id="dog" class="com.lyj.bean.Dog"/>
- 注解方式
@Component
public class People {
@Autowired
@Qualifier(value = "dog")
private Dog dog;
@Value("张三")
private String name;
}
依赖注入只是IOC的一种实现,我们希望将对象的创建和管理交给Spring容器管理,这会让我们在管理类的时候不再需要进行复杂的代码更改,而用注入的方式一次性改变
例如:
private SqlService sqlService = new MySqlServiceImpl()
如果我们需要更改实现类,我们需要重新new一个对象
private SqlService sqlService = new OracleServiceImpl()
但是依赖注入的方式不同,它是这样实现的
@Resource(name = "mySqlServiceImpl")
private SqlService sqlService
@Resource(name = "oracleServiceImpl")
private SqlService sqlService
这样节省了我们出创建一个新对象的额外开销。