类的注解
@Component
@Service service层
@Controller web层
@Repository dao层
上面四个注解是功能一样的,都可以实现对象的创建,只是习惯把 每个类用在对应的层中,使开发更加清晰
基于注解方式 实现对象的创建
1.引入spring-aop-5.2.6.RELEASE.jar 包,在之前下载的spring-framework-5.2.6.RELEASE的libs中
2.在xml中开启组件扫描
注意约束中添加了两行
3.创建类 在类声明前@后面加需要的那四个类中的一个
package com.service;
import org.springframework.stereotype.Service;
@Service(value = "aa")
//如果按上面这么写,则调用时候应该这样写:
//Userservice userservice=context.getBean("aa",Usersrvice.class);
// 如果没有写value,调用的时候默认是类名的第一个字母小写,应该如下调用:
//Usersrvice usersrvice=context.getBean("userservice",Usersrvice.class);
public class Usersrvice {
public void print()
{
System.out.println("userservice的输出");
}
public static void main(String[] args) {
System.out.println(" hello world");
}
}
调用正常写即可
import com.service.Usersrvice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testdemo {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("demo1.xml");
Usersrvice usersrvice= context.getBean("usersrvice",Usersrvice.class);
System.out.println(usersrvice);
usersrvice.print();
}
}
4.开启组件扫描的细节
选择扫描哪些
选择哪些类不扫描
对象作为另一个类的属性的注解(对象属性)
@Autowired//根据类型进行注入
import com.dao.Userdao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "aa")//service层的类应该用@Service注解
//如果不写参数,则 Usersrvice usersrvice=context.getBean("aa",Usersrvice.class);
// 调用的时候默认是类名的第一个字母小写
//Usersrvice usersrvice=context.getBean("userservice",Usersrvice.class);
public class Userservice {
@Autowired//根据类型进行注入
public Userdao userdao;
public void print()
{
System.out.println("userservice的输出");
}
public static void main(String[] args) {
System.out.println(" hello world");
}
}
userdao类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository//dao层类的应该用repository注解
public class Userdao {
public void print()
{
System.out.println("dao的方法执行");
}
}
测试类
import com.service.Userservice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testdemo {
public static void main(String[] args) {
ApplicationContext context=new ClassPathXmlApplicationContext("demo1.xml");
Userservice userservice= context.getBean("aa",Userservice.class);
// System.out.println(userservice);
userservice.userdao.print();
}
}
输出
@qualifier 根据属性名称注入 当我userdao是个接口,有好多实现类,那么根据类型注入就不行了,需要@qualifier进行辅助
import com.dao.Userdaoimpl1;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service;
@Service(value = "aa")
//如果不写参数,则 Usersrvice usersrvice=context.getBean("aa",Usersrvice.class);
// 调用的时候默认是类名的第一个字母小写
//Usersrvice usersrvice=context.getBean("userservice",Usersrvice.class);
public class Userservice {
@Autowired//根据类型进行注入
@Qualifier("daoimpl1")
public Userdaoimpl1 userdao;
public void print()
{
System.out.println("userservice的输出");
}
public static void main(String[] args) {
System.out.println(" hello world");
}
}
package com.dao;
import org.springframework.stereotype.Repository;
@Repository(value = "daoimpl1")//不写默认就是首字母小写userdaoimpl1
public class Userdaoimpl1 implements Userdao{
public void print()
{
System.out.println("dao的方法执行");
}
}
@Resource 根据类型注入
@Resource(name="daoimpl1")根据名称注入
import javax.annotation.Resource;//这个resource不是spring的官方包中的,所以不鼓励用这个
@Service(value = "aa")
//如果不写参数,则 Usersrvice usersrvice=context.getBean("aa",Usersrvice.class);
// 调用的时候默认是类名的第一个字母小写
//Usersrvice usersrvice=context.getBean("userservice",Usersrvice.class);
public class Userservice {
@Resource(name="daoimpl1")
public Userdaoimpl1 userdao;
public void print()
{
System.out.println("userservice的输出");
}
public static void main(String[] args) {
System.out.println(" hello world");
}
}
@Value(value = "10")给普通的属性赋值
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Repository;
@Repository(value = "daoimpl1")//不写默认就是首字母小写userdaoimpl1
public class Userdaoimpl1 implements Userdao{
@Value(value = "10")
public int aa;
public void print()
{
System.out.println("dao的方法执行");
}
}
去掉xml配置文件,使用注解 作为配置类(全注解开发)
新建一个类config,用来替代xml文件
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = {"com"})//basepackages是寻找组件的范围
// 相当于xml文件中的
public class Config {
}
将原来xml的位置换为config类
将对象换为AnnotationConfigApplicationContext
ApplicationContext context=new AnnotationConfigApplicationContext(Config.class);
import com.service.Userservice;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Testdemo {
public static void main(String[] args) {
ApplicationContext context=new AnnotationConfigApplicationContext(Config.class);
Userservice userservice= context.getBean("aa",Userservice.class);
userservice.userdao.print();
}
}