Spring之注解开发与Config配置
注意:在spring4后想用注解开发需要引入 aop的包,所以导入依赖的时候直接导入springmvc的依赖。
导入依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.12.RELEASE</version>
</dependency>
配置文件中引入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">
<!--指定注解扫描包-->
<context:component-scan base-package="com.xiong"/>
<context:annotation-config/>
</beans>
1.Bean的实现
在pojo中编写User:
// 相当于配置文件中 <bean id="User" class="当前注解的类"/>
@Component
public class User {
public String name= "小熊";
}
测试类:
public class Mytest {
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
User user = context.getBean("user", User.class);
System.out.println(user.name);
}
}
2.属性注入
使用注解在User中进行属性的注入:
2.1在不提供set方法的时候可以直接用@Value进行属性的注入:
@Component("user")//设置“user”相当于将id设为user 否则默认id为其文件名
// 相当于配置文件中 <bean id="user" class="当前注解的类"/>
public class User {
@Value("小熊")
// 相当于配置文件中 <property name="name" value="小熊"/>
public String name;
}
2.2 提供了set的方法可以在set方法上用注解@Value进行属性的注入:
@Component
public class User {
public String name;
@Value("小熊")
public void setName(String name) {
this.name = name;
}
}
3.衍生的@Component三个衍生注解
为了更好的进行分层,Spring可以使用其它三个注解,功能一样,目前使用哪一个功能都一样。
@Controller:web层
@Service:service层
@Repository:dao层
写上这些注解,就相当于将这个类交给Spring管理装配了!注解**
4.作用域
@scope
singleton:默认的,Spring会采用单例模式创建这个对象。关闭工厂 ,所有的对象都会销毁。
prototype:多例模式。关闭工厂 ,所有的对象不会销毁。内部的垃圾回收机制会回收
@Controller("user")
@Scope("prototype")
public class User {
@Value("小熊")
public String name;
}
5.使用JavaConfig配置:
实体类:
/这个注解的意思就是说明这类的被Spring被接管了,注册到容器中
@Component
//@Import(MyConfig2.class) //导入合并其他配置类,类似于配置文件中的 inculde 标签
public class User {
private String name;
public String getName() {
return name;
}
@Value("jdalkjdla")//属性注入值
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
'}';
}
}
新建config配置包,编写一个MyConfig配置类:
@Configuration
public class MyConfig {
//注册一个bean,就相当于我们之前写的一个bean标签
//这个方法的名字就相当于bean中的id属性
//这个方法的返回值,就相当于bean标签中的class属性
@Bean
public User getuser(){
return new User();//就是返回注入到bean的返回值
}
}
测试类:
public class Mytest {
public static void main(String[] args) {
//如果完全使用了配置类方式去做,我们只能通过AnnotationConfigApplication上下文获取容器,通过配置类的class对象加载
ApplicationContext Context = new AnnotationConfigApplicationContext(MyConfig.class);
User getuser = (User) Context.getBean("getuser");
System.out.println(getuser.getName());
}
}
6.总结
XML与注解的比较:
- xml可以使用与任何的场合,结构比较清晰,维护比较方便。
- 注解开发比较简单,但是要使用提供好的类,维护不方便。
- 建议使用注解与xml整合开发。