类的注解
@Component
@Service service层
@Controller web层
@Repository dao层
上面四个注解是功能一样的,都可以实现对象的创建,只是习惯把 每个类用在对应的层中,使开发更加清晰
基于注解方式 实现对象的创建
1.引入spring-aop-5.2.6.RELEASE.jar 包,在之前下载的spring-framework-5.2.6.RELEASE的libs中
2.在xml中开启组件扫描
注意约束中添加了两行
<?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.dao,com.service"></context:component-scan>
<!-- 或者写到多个包的上级目录-->
<context:component-scan base-package="com"></context:component-scan>
</beans>
3.创建类 在类声明前@后面加需要的那四个类中的一个
package com.service;
import org.springframework.stereotype.Service;
@Service(value = "aa")
//给类起别名,相当于<bean id="" class=""> 中的id
//Userservice userservice=context.getBean("aa");
// 如果没有写value,调用的时候默认是类名的第一个字母小写,应该如下调用:
//Usersrvice usersrvice=context.getBean("userservice");
或者直接按类型调用 Usersrvice usersrvice=context.getBean(Userservice.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 或者为类型userservice的ioc类
Usersrvice usersrvice= context.getBean("usersrvice",Usersrvice.class);
System.out.println(usersrvice);
usersrvice.print();
}
}
4.开启组件扫描的细节
选择扫描哪些
<!-- use-default-filters="false" 禁用默认的组件扫描,即不扫描所有组件 -->
<context:component-scan base-package="com.dao,com" use-default-filters="false">
<!-- type="annotation" 以注解方式注入-->
<!-- expression="org.springframework.stereotype.Service" 只扫描service注解-->
<context:include-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
选择哪些类不扫描
<context:component-scan base-package="com.dao,com" >
<!-- type="annotation" 以注解方式注入-->
<!-- expression="org.springframework.stereotype.Service" 不扫描service注解,其他的都扫描-->
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Service"/>
</context:component-scan>
对象作为另一个类的属性的注解(对象属性)
@Autowired//根据类型进行注入 去找类型名和下面定义属性一样的,
public Userdao userdao; 就是去ioc容器中找 userdao类 如果写了value ,就是找类型为value的ico类
import com.dao.Userdao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service(value = "aa")
public class Userservice {
@Autowired//根据类型进行注入,去ioc中找类型是Userdao的组件
public Userdao userdao;
public void print()
{
System.out.println("userservice的输出");
}
}
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 根据属性名称注入 当一个类在ioc容器中有多个实例时,需要@autowired和@qualifier一起使用 ,来确定从ioc中获得的到底是哪个类
<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:annotation-config></context:annotation-config>
<context:component-scan base-package="com"></context:component-scan>
<bean id="userdao" class="com.atguigu.spring5.UserDaoMysqlimpl"></bean>
<bean class="com.atguigu.spring5.Service" id="service"></bean>
<bean id="userdao1" class="com.atguigu.spring5.UserDaoMysqlimpl"></bean>
</beans>
package com.atguigu.spring5;
import org.junit.runners.Parameterized;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
public class Service {
@Autowired
@Qualifier(value = "userdao1")
public UserDaoMysqlimpl userDaoMysqlimpl;
public int id;
public void print(){
userDaoMysqlimpl.print();
}
}
package com.atguigu.spring5;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test1 {
Service service1=new Service();
@Test
public void test(){
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("Spring.xml");
Service service= (Service) applicationContext.getBean("service");
service.userDaoMysqlimpl.print();
}
}
@Resource 根据类型注入 (不是spring官方的,不鼓励)
@Resource(name="daoimpl1")根据名称注入
import javax.annotation.Resource;//这个resource不是spring的官方包中的,所以不鼓励用这个
@Service(value = "aa")
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")//,给ioc中的类起别名,不写默认就是首字母小写userdaoimpl1
public class Userdaoimpl1 implements Userdao{
@Value(value = "10")
public int aa;
public void print()
{
System.out.println("dao的方法执行");
}
}