廣州網(wǎng)站建設(shè)網(wǎng)絡(luò)推廣怎么網(wǎng)站推廣
2023.11.11
????????注解的存在主要是為了簡化XML的配置。Spring6倡導全注解開發(fā)。
????????負責聲明Bean的注解,常見的包括四個:
- @Component
- @Controller
- @Service
- @Repository
????????通過源碼可以發(fā)現(xiàn),@Controller、@Service、@Repository這三個注解都是@Component注解的別名。也就是說:這四個注解的功能都一樣。用哪個都可以。
只是為了增強程序的可讀性,建議:
- 控制器類上使用:Controller
- service類上使用:Service
- dao類上使用:Repository
他們都是只有一個value屬性。value屬性用來指定bean的id,也就是bean的名字。
Spring注解的簡單使用
配好相關(guān)環(huán)境之后,在Bean類上使用注解:
package spring;import org.springframework.stereotype.Component;@Component(value = "userBean")
public class User {
}
編寫測試程序:
package test;import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import spring.User;public class IocAnnotationTest {@Testpublic void testBeanComponent(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");User userBean = applicationContext.getBean("userBean", User.class);System.out.println(userBean);}
}
運行結(jié)果:
ps:如果注解的屬性名是value,那么value是可以省略的。
ps:如果把value屬性徹底去掉,spring會被Bean自動取名,并且默認名字是:Bean類名首字母小寫。
負責注入的注解
????????@Component @Controller @Service @Repository 這四個注解是用來聲明Bean的,聲明后這些Bean將被實例化。接下來看看如何給Bean的屬性賦值。給Bean屬性賦值需要用到這些注解:
- @Value
- @Autowired
- @Qualifier
- @Resource
@Value:
當屬性的類型是簡單類型時,可以使用@Value注解進行注入。
使用@Value注解修改bean代碼:
package spring;import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;@Component(value = "userBean")
public class User {@Value("jay")private String name;@Value("23")private int age;@Overridepublic String toString() {return "User{" +"name='" + name + '\'' +", age=" + age +'}';}
}
運行測試程序,結(jié)果如下:
????????通過以上代碼可以發(fā)現(xiàn),我們并沒有給屬性提供setter方法,但仍然可以完成屬性賦值。如果提供setter方法,并且在setter方法上添加@Value注解,也可以完成注入,這里就不測試了。為了簡化代碼,以后我們一般不提供setter方法,直接在屬性上使用@Value注解完成屬性賦值。
@Autowired與@Qualifier:
????????@Autowired注解可以用來注入非簡單類型。單獨使用@Autowired注解,默認根據(jù)類型裝配。(默認是byType)。
? ? ? ? 通過源碼得知,該注解可以標注在:構(gòu)造方法上、方法上、形參上、屬性上、注解上。
????????該注解還有一個required屬性,默認值是true,表示在注入的時候要求被注入的Bean必須是存在的,如果不存在則報錯。
????????@Autowired注解默認根據(jù)類型注入。如果要根據(jù)名稱注入的話,需要配合@Qualifier注解一起使用。
@Resource
@Resource注解也可以完成非簡單類型注入,它和@Autowired注解有什么區(qū)別?
- @Resource注解是JDK擴展包中的,也就是說屬于JDK的一部分。所以該注解是標準注解,更加具有通用性。(JSR-250標準中制定的注解類型。JSR是Java規(guī)范提案。)
- @Autowired注解是Spring框架自己的。
- @Resource注解默認根據(jù)名稱裝配byName,未指定name時,使用屬性名作為name。通過name找不到的話會自動啟動通過類型byType裝配。
- @Autowired注解默認根據(jù)類型裝配byType,如果想根據(jù)名稱裝配,需要配合@Qualifier注解一起用。
- @Resource注解用在屬性上、setter方法上。
- @Autowired注解用在屬性上、setter方法上、構(gòu)造方法上、構(gòu)造方法參數(shù)上。
下面使用代碼簡單使用一下這個注解:
編寫接口:
package dao;public interface UserDao {void insert();
}
實現(xiàn)該接口的類:
package dao.impl;import dao.UserDao;
import org.springframework.stereotype.Repository;@Repository("userDaoImplForMysql")
public class UserDaoImplForMysql implements UserDao {@Overridepublic void insert() {System.out.println("Mysql數(shù)據(jù)庫正在插入數(shù)據(jù)");}
}
service類:
package service;import dao.UserDao;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;@Service("userService") //納入容器管理
public class UserService {@Resource(name = "userDaoImplForMysql")private UserDao userDao;public void save(){userDao.insert();}
}
測試程序:
@Testpublic void testResource(){ApplicationContext applicationContext = new ClassPathXmlApplicationContext("spring.xml");UserService userService = applicationContext.getBean("userService", UserService.class);userService.save();}
運行結(jié)果: